В UTF-8, один символ не всегда кодируется с одинаковым количеством байтов. В зависимости от символа может потребоваться кодирование 1, 2, 3 или даже 4 байта. Поэтому определенно нет тривиального вопроса, чтобы попытаться сопоставить байты UTF-8 самостоятельно с Java char
, который использует кодировку UTF-16, где каждый char
кодируется с использованием 2 байтов. Не говоря уже о том, что в зависимости от персонажа (кодовая точка> 0xffff) вам также может быть нужно беспокоиться о том, как обращаться с суррогатными персонажами, что является еще одним осложнением, которое вы можете легко ошибиться.
Все это говорит о том, что Andreas
абсолютно прав. Вы должны сосредоточиться на разборе строки в массиве байтов, а затем позволить встроенным библиотекам преобразовывать байты UTF-8 в строку Java для вас. Из строки Java тривиально извлекать коды кода Unicode, если это то, что вы хотите.
Ниже приведен пример кода, который показывает один из способов это может быть достигнуто:
public static void main(String[] args) throws Exception {
String src = "=D0=93=D0=B0=D0=B7=D0=B5=D1=82=D0=B0";
// Parse string into hex string tokens.
String[] tokens = Arrays.stream(src.split("="))
.filter(s -> s.length() != 0)
.toArray(String[]::new);
// Convert the hex string representations to a byte array.
byte[] utf8bytes = new byte[tokens.length];
for (int i = 0; i < utf8bytes.length; i++) {
utf8bytes[i] = (byte) Integer.parseInt(tokens[i], 16);
}
// Convert UTF-8 bytes to Java String.
String str = new String(utf8bytes, StandardCharsets.UTF_8);
// Display string + individual unicode code points.
System.out.println(str);
str.codePoints().forEach(System.out::println);
}
Выход:
Газета
1043
1072
1079
1077
1090
1072
FWIW, точка кода Java, не могут быть представлены в виде 2 шестнадцатеричных цифр. Для всех кодовых точек в базовой многоязычной плоскости требуется 4 шестнадцатеричных цифры (от 0x0000 до 0xFFFF). Не совсем корректно ссылаться на 8-битную кодировку UTF-8 как «Кодовую точку Юникода». – scottb