java - String.getBytes() 的结果是否会包含零?

标签 java

我尝试了许多带有随机字符的字符串,除了空字符串“”,它们的 .getBytes() 字节数组似乎从不包含任何 0 值(如 {123、-23、54、0、-92})。

他们的 .getBytes() 字节数组是否总是不包含任何 nero,除了一个空字符串?

编辑:之前的测试代码如下。现在我了解到,在 Java 8 中,如果字符串由 (char) random.nextInt(65535) + 1 组成,结果似乎总是“不包含 0”;如果字符串包含 (char) 0,则“包含 0”。

private static String randomString(int length){
    Random random = new Random();

    char[] chars = new char[length];
    for (int i = 0; i < length; i++){
        int integer = random.nextInt(65535) + 1;
        chars[i] = (char) (integer);
    }
    return new String(chars);
}

public static void main(String[] args) throws Exception {

    for (int i = 1; i < 100000; i++){
        String s1 = randomString(10);
        byte[] bytes = s1.getBytes();
        for (byte b : bytes) {
            if (b == 0){
                System.out.println("contains 0");
                System.exit(0);
            }
        }
    }
    System.out.println("contains no 0");

}

最佳答案

它确实取决于您的平台本地编码。但在许多编码中,'\0'(null)字符将导致 getBytes() 返回一个包含零的数组。

System.out.println("\0".getBytes()[0]);

这适用于 US-ASCII、ISO-8859-1 和 UTF-8 编码:

System.out.println("\0".getBytes("US-ASCII")[0]);
System.out.println("\0".getBytes("ISO-8859-1")[0]);
System.out.println("\0".getBytes("UTF-8")[0]);

如果你有一个字节数组,并且想要对应的字符串,也可以反过来:

byte[] b = { 123, -23, 54, 0, -92 };
String s = new String(b);

但是这对于不同的编码会给出不同的结果,并且在某些编码中它可能是一个无效的序列。

其中的字符可能无法打印。

最好的选择是 ISO-8859-1 编码,只能打印空字符:

byte[] b = { 123, -23, 54, 0, -92 };
String s = new String(b, "ISO-8859-1");
System.out.println(s);
System.out.println((int) s.charAt(3));

编辑

在您发布的代码中,如果您指定 UTF-16 编码,也很容易得到“包含 0”:

byte[] bytes = s1.getBytes("UTF-16");

这都是关于编码的,你还没有指定它。当您没有将它作为参数传递给 getBytes 方法时,它会采用您的平台默认编码。

要找出您平台上的内容,请运行以下命令:

System.out.println(System.getProperty("file.encoding"));

在 MacOS 上,它是 UTF-8;在 Windows 上,它可能是像 Cp-1252 这样的 Windows 代码页之一。您也可以在运行 Java 时在命令行中指定平台默认值:

java -Dfile.encoding=UTF16 <the rest>

如果您以这种方式运行代码,您还会看到它包含 0。

关于java - String.getBytes() 的结果是否会包含零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34573335/

相关文章:

java - 如何动态添加微调器(通过按下按钮)?

java - 我应该如何以及在哪里添加要运行的主要方法?

java - Phonegap 与 native 是否易于开发?

java - 是否可以查询 Java VM 以找到最大可能的数组大小?如何?

java - ResultSet 在有效结果上返回 null

java - 立方曲线JavaFX

java - 为什么来自资源的 CSS 在 spring jsp 页面中不起作用?

java - Spring数据JPA和可以为空的参数

JAVA MySQL 插入 AES_ENCRYPT 失败 java.sql.SQLException : Incorrect string value

java - ServerBootstrap绑定(bind)方法