Как конвертировать Unicode в байты в Java? - PullRequest
0 голосов
/ 03 июля 2019

У меня есть следующий код для преобразования юникода в байты, он работает:

    byte[] emojiBytes = new byte[]{(byte)0xF0,(byte)0x9F,(byte)0x98,(byte)0x81};
    String emojiAsString = new String(emojiBytes,Charset.forName("UTF-8"));
    // JButton button = new JButton("<html>" + emojiAsString + "</html>");
    JButton button = new JButton(emojiAsString);

Но что, если я знаю только юникод, подобный этому: 1F601, 1F603, я хочу преобразовать символы на этой странице: https://apps.timwhitlock.info/emoji/tables/unicode

Учитывая строку типа 1F601, как мне преобразовать ее в \xF0\x9F\x98\x81, затем в new byte[]{(byte)0xF0,(byte)0x9F,(byte)0x98,(byte)0x81}?

Итак, для упрощения мой код будет выглядеть так:

JButton getButton(String unicodeText)
{
    JButton aButton= // how to convert ???

    return aButton;
}

Тогда я называю это так: JButton myButton=getButton("1F601");

1 Ответ

1 голос
/ 03 июля 2019

Шестнадцатеричная строка дает шестнадцатеричное число, которое является кодовой точкой Unicode;затем его необходимо преобразовать в UTF-8.Проблема в том, что кодовая точка превышает 0xFFFF, что означает, что она не может быть напрямую представлена ​​как символ Java.

После небольшого исследования, вот одна быстрая и грязная тестовая программа.

Character.toChars преобразуется в массив char, с помощью которого мы создаем String;

getBytes () затем преобразует это в байты UTF-8.

Даже если строка использует UTF-16, последующее преобразование обрабатывает один символ как единое целое (что на самом деле требуется стандартом).

import java.nio.charset.StandardCharsets;

class Z {
     public static void main(String[] args) {
        int cp = 0x1f601;
        byte b[] = new String(Character.toChars(cp)).getBytes(StandardCharsets.UTF_8);
        for (int k=0; k<b.length; k++) 
              System.out.printf(" %x ", b[k]);
        System.out.println();
     }
}

Вывод:

$ java Z
 f0  9f  98  81
...