【发布时间】:2020-06-01 09:18:10
【问题描述】:
在编程时,我遇到了字符串转换为字节然后再次返回字符串的奇怪行为。一些字符转换错误,因此字符串的hashCode 也发生了变化。字符串的长度保持不变。
从 55296 到 57343(U+D800 到 U+DFFF)的字符似乎会出现问题。其他字符工作正常。是因为他们是代理人吗?
String string = new String(new char[] { 56000 });
System.out.println((int)string.charAt(0));
System.out.println((int)new String(string.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8).charAt(0));
控制台输出为:
56000
63
这里发生了什么?这是一个java错误,还是我误解了什么?
【问题讨论】:
-
长度为 1 的 String 的 hashCode 只不过是它本身的 char。我在问题中替换了它。
-
您为什么要进行这些转换?字符串不是二进制数据的容器。对所有内容都使用字节数组。
-
加密/解密必须使用字符串。如果字符串格式错误,我现在将抛出异常。