Рассмотрим следующий код:
byte aBytes[] = { (byte)0xff,0x01,0,0,
(byte)0xd9,(byte)0x65,
(byte)0x03,(byte)0x04, (byte)0x05, (byte)0x06, (byte)0x07,
(byte)0x17,(byte)0x33, (byte)0x74, (byte)0x6f,
0, 1, 2, 3, 4, 5,
0 };
String sCompressedBytes = new String(aBytes, "UTF-16");
for (int i=0; i<sCompressedBytes.length; i++) {
System.out.println(Integer.toHexString(sCompressedBytes.codePointAt(i)));
}
Получает следующий неверный вывод:
ff01, 0, fffd, 506, 717, 3374, 6f00, 102, 304, 500.
Однако, если 0xd9
во входных данных изменяется на 0x9d
, то получается следующий правильный вывод:
ff01, 0, 9d65, 304, 506, 717, 3374, 6f00, 102, 304, 500.
Я понимаю, что функциональность обусловлена тем фактом, что байт 0xd9
является высокосуррогатным маркером Unicode.
Вопрос: Есть ли способ подачи, идентификации и извлечения суррогатных байтов (0xd800
до 0xdfff
) в строке Java Unicode?
Спасибо