我尝试了很多带有随机字符的字符串,除了空字符串""之外,它们的.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)
它取决于您的平台本地编码.但是在许多编码中,'\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.