Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.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字符到字节的转换错误(UTF-8)_Java_String_Encoding - Fatal编程技术网

Java字符到字节的转换错误(UTF-8)

Java字符到字节的转换错误(UTF-8),java,string,encoding,Java,String,Encoding,在编程时,我遇到了一个奇怪的行为,字符串被转换成字节,然后又被转换回字符串。某些字符转换错误,因此字符串的hashCode也会更改。字符串的长度保持不变。 问题似乎发生在55296-57343(U+D800到U+DFFF)的字符上。其他角色也可以。是因为他们是代理人吗 String String=新字符串(新字符[]{56000}); System.out.println((int)string.charAt(0)); System.out.println((int)新字符串(String.ge

在编程时,我遇到了一个奇怪的行为,字符串被转换成字节,然后又被转换回字符串。某些字符转换错误,因此字符串的
hashCode
也会更改。字符串的长度保持不变。 问题似乎发生在55296-57343(U+D800到U+DFFF)的字符上。其他角色也可以。是因为他们是代理人吗

String String=新字符串(新字符[]{56000});
System.out.println((int)string.charAt(0));
System.out.println((int)新字符串(String.getBytes(StandardCharsets.UTF_8)、StandardCharsets.UTF_8.charAt(0));
控制台输出为:

56000
63

这是怎么回事?这是一个java错误,还是我误解了什么?

这是因为这些值不是字符而是代理。其中两个值形成代理项对,代理项对依次表示一个字符。如果只有一个低或高的代理项值,则这是无效编码,而不是字符

由于这是一种无效编码,因此在将其转换为UTF-8时,它将被替换为“?”字符


您可以阅读更多关于它的信息,例如这里

长度为1的字符串的hashCode就是它本身的char。我在问题中替换了它。你为什么要做这些转换?字符串不是二进制数据的容器。对所有内容使用字节数组。必须使用字符串的加密/解密。如果字符串格式不正确,我现在将抛出一个异常。但是为什么
string.getBytes(UTF_8)
是一个单字节数组呢?另一个去哪里?有趣的行为!因此java希望代理项具有后续字符,否则它会被错误编码。