【发布时间】:2018-10-23 12:04:35
【问题描述】:
我偶然发现了编码/解码字符串的奇怪行为。看一个例子:
@Test
public void testEncoding() {
String str = "\uDD71"; // {56689}
byte[] utf16 = str.getBytes(StandardCharsets.UTF_16); // {-2, -1, -1, -3}
String utf16String = new String(utf16, StandardCharsets.UTF_16); // {65533}
assertEquals(str, utf16String);
}
我认为这个测试会通过,但事实并非如此。有人可以解释为什么编码和解码的字符串不等于原始字符串吗?
【问题讨论】:
-
你必须至少显示实际输出
-
您想查看哪个输出?字节数组? utf16字符串?以什么形式?我认为你可以很容易地自己运行这个测试。一般来说,输出是那些字符串是不同的
-
\uDD71是低代理。单独它是无用的,不表示任何代码点。因此它被替换为\uFFFD -
如果您更喜欢异常而不是替换,请避免使用 String 构造函数。
标签: java string unicode character-encoding unicode-literals