字符串在编码和解码后不同
String differs after encoding and decoding
我偶然发现了 encoding/decoding 字符串的奇怪行为。看一个例子:
@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);
}
我假设这个测试会通过,但事实并非如此。谁能解释一下为什么编码和解码后的字符串不等于原来的字符串?
U+DD71 不是有效的代码点,因为 U+D800..U+DFFF 由 Unicode 保留,以免与 UTF-16 混淆。因此,这些代码点永远不应作为有效字符数据出现。来自 Unicode 标准:
Isolated surrogate code points have no interpretation; consequently, no character code charts or names lists are provided for
this range.
这有效,但是:
@Test
public void testEncoding() {
String str = "\u0040";
byte[] utf16 = str.getBytes(StandardCharsets.UTF_16);
String utf16String = new String(utf16, StandardCharsets.UTF_16);
assertEquals(str, utf16String);
}
所以,这不是您的代码有问题,而是您尝试使用无效的代码点。
我偶然发现了 encoding/decoding 字符串的奇怪行为。看一个例子:
@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);
}
我假设这个测试会通过,但事实并非如此。谁能解释一下为什么编码和解码后的字符串不等于原来的字符串?
U+DD71 不是有效的代码点,因为 U+D800..U+DFFF 由 Unicode 保留,以免与 UTF-16 混淆。因此,这些代码点永远不应作为有效字符数据出现。来自 Unicode 标准:
Isolated surrogate code points have no interpretation; consequently, no character code charts or names lists are provided for this range.
这有效,但是:
@Test
public void testEncoding() {
String str = "\u0040";
byte[] utf16 = str.getBytes(StandardCharsets.UTF_16);
String utf16String = new String(utf16, StandardCharsets.UTF_16);
assertEquals(str, utf16String);
}
所以,这不是您的代码有问题,而是您尝试使用无效的代码点。