2015-08-30 2 views
1

Как можно изменить значение UTF-8 как =D0=93=D0=B0=D0=B7=D0=B5=D1=82=D0=B0 в Java?Java конвертировать код кодировки Unicode в строку

Я пытался что-то вроде:

Character.toCodePoint((char)(Integer.parseInt("D0", 16)),(char)(Integer.parseInt("93", 16)); 

но не преобразуется в допустимый код точки.

+1

FWIW, точка кода Java, не могут быть представлены в виде 2 шестнадцатеричных цифр. Для всех кодовых точек в базовой многоязычной плоскости требуется 4 шестнадцатеричных цифры (от 0x0000 до 0xFFFF). Не совсем корректно ссылаться на 8-битную кодировку UTF-8 как «Кодовую точку Юникода». – scottb

ответ

4

Эта строка является кодировкой байтов в шестнадцатеричном формате, поэтому наилучшим способом является декодирование строки в byte[], а затем вызовите new String(bytes, StandardCharsets.UTF_8).

Update

Вот немного более прямой вариант декодирования строки, чем это предусмотрено «sstan» в другой ответ. Конечно, обе версии хороши, поэтому используйте то, что вам удобно, или напишите собственную версию.

String src = "=D0=93=D0=B0=D0=B7=D0=B5=D1=82=D0=B0"; 

assert src.length() % 3 == 0; 
byte[] bytes = new byte[src.length()/3]; 
for (int i = 0, j = 0; i < bytes.length; i++, j+=3) { 
    assert src.charAt(j) == '='; 
    bytes[i] = (byte)(Character.digit(src.charAt(j + 1), 16) << 4 | 
         Character.digit(src.charAt(j + 2), 16)); 
} 
String str = new String(bytes, StandardCharsets.UTF_8); 

System.out.println(str); 

Выход

Газета 
1

В 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 
Смежные вопросы