Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java String.getBytes()的结果是否会包含零?_Java - Fatal编程技术网

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

Java String.getBytes()的结果是否会包含零?,java,Java,我尝试过许多带有随机字符的字符串,除了空字符串“”,它们的.getBytes()字节数组似乎从不包含任何0值(如{123,-23,54,0,-92}) 它们的.getBytes()字节数组总是不包含nero,只有一个空字符串吗 编辑:前面的测试代码如下所示。现在我了解到,在Java8中,如果字符串由(char)random.nextInt(65535)+1组成,那么结果似乎总是“不包含0”;如果字符串包含(char)0,则为“包含0” 私有静态字符串randomString(int-length

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

它们的.getBytes()字节数组总是不包含nero,只有一个空字符串吗

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

私有静态字符串randomString(int-length){
随机=新随机();
char[]chars=新字符[长度];
for(int i=0;i
它确实取决于您的平台本地编码。但是在许多编码中,
'\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>
java-Dfile.encoding=UTF16
如果以这种方式运行代码,您还将看到它包含0

它们的.getBytes()字节数组总是不包含nero,只有一个空字符串吗

不,没有这样的保证。首先,也是最重要的,返回“使用平台默认字符集的字节序列”。因此,没有什么可以阻止您将某些值显式编码为
0
s

更实际地说,许多常见编码将包含零字节,特别是用于表示。但是,即使字符串不包含
NUL
,字节序列也可能包含
0
s。特别是(它)表示两个字节中的所有字符,这意味着ASCII字符(只需要一个)与
0
字节配对


您也可以通过尝试使用适当的构造函数(例如或)从包含
0
s的字节序列构造
字符串来轻松地测试这一点。例如(请注意,我的系统的默认字符集是UTF-8):

印刷品:

Default encoding: UTF-8
Empty string: []
NUL char: [0]
String constructed from {0} array: [0]
'a' in UTF-16: [-2, -1, 0, 97]

您能否提供您尝试过的字符串以及代码。仅提供最少的特定代码。请注意,在某些情况下,空字符串
不会编码到包含
0
元素的字节数组中。ASCII、UTF-8和ISO_8859_1都将空字符串表示为空数组。如果您看到的是
encode to
{0}
,您的系统正在使用其他默认字符集,您不应该期望您的结果是典型的。很抱歉,我没有仔细检查。空字符串对我来说也是一个空数组。
System.out.println("Default encoding: " + System.getProperty("file.encoding"));
System.out.println("Empty string: " + Arrays.toString("".getBytes()));
System.out.println("NUL char: " + Arrays.toString("\0".getBytes()));
System.out.println("String constructed from {0} array: " +
                   Arrays.toString(new String(new byte[]{0}).getBytes()));
System.out.println("'a' in UTF-16: " +
                   Arrays.toString("a".getBytes(StandardCharsets.UTF_16)));
Default encoding: UTF-8
Empty string: []
NUL char: [0]
String constructed from {0} array: [0]
'a' in UTF-16: [-2, -1, 0, 97]