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

Tom*_*Tom 2 java

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

除了空字符串之外,它们的.getBytes()字节数组总是不包含任何nero吗?

编辑:以前的测试代码如下.现在我了解到,在Java 8中,如果String由(char)random.nextInt(65535)+ 1组成,结果似乎总是"不包含0"; 如果String包含(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");

}
Run Code Online (Sandbox Code Playgroud)

Erw*_*idt 7

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

System.out.println("\0".getBytes()[0]);
Run Code Online (Sandbox Code Playgroud)

这将适用于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]);
Run Code Online (Sandbox Code Playgroud)

如果你有一个字节数组,并且你想要与之对应的字符串,你也可以这样做:

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

然而,这将针对不同的编码给出不同的结果,并且在一些编码中,它可能是无效的序列.

并且其中的字符可能无法打印.

您最好的选择是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));
Run Code Online (Sandbox Code Playgroud)

编辑

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

byte[] bytes = s1.getBytes("UTF-16");
Run Code Online (Sandbox Code Playgroud)

这都是关于编码的,你还没有指定它.如果您尚未将其作为getBytes方法的参数传递,则它将采用您的平台默认编码.

要了解平台上的内容,请运行以下命令:

System.out.println(System.getProperty("file.encoding"));
Run Code Online (Sandbox Code Playgroud)

在MacOS上,它是UTF-8; 在Windows上,它可能是像Cp-1252这样的Windows代码页之一.您还可以在运行Java时在命令行上指定platform default:

java -Dfile.encoding=UTF16 <the rest>
Run Code Online (Sandbox Code Playgroud)

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