Строка отличается после кодирования и декодирования - PullRequest
0 голосов
/ 13 мая 2018

Я наткнулся на странное поведение строки кодирования / декодирования.Взгляните на пример:

@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);
}

Я бы предположил, что этот тест пройдёт, но это не так.Может кто-нибудь объяснить, почему закодированная и декодированная строка не совпадает с исходной?

1 Ответ

0 голосов
/ 13 мая 2018

U + DD71 не является допустимой кодовой точкой, поскольку U + D800..U + DFFF зарезервированы Unicode, чтобы не вызывать путаницу с UTF-16.Таким образом, эти кодовые точки никогда не должны появляться в качестве допустимых символьных данных.Из стандарта Unicode:

Отдельные суррогатные кодовые точки не имеют интерпретации;следовательно, для этого диапазона не предусмотрены таблицы кодов символов или списки имен.

Это работает, хотя:

@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);
}

Таким образом, это не ваш код ошибки, а то, что выпытаемся использовать недопустимую кодовую точку.

...