如何在Java中将Unicode转换为字节?

时间:2019-07-03 00:09:50

标签: java unicode type-conversion

我有以下代码将unicode转换为字节,它可以工作:

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

但是,如果我只知道这样的unicode:1F6011F603,我想在此页面上转换符号: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 个答案:

答案 0 :(得分:1)

十六进制字符串给出一个十六进制数字,它是Unicode代码点;然后需要将其转换为UTF-8。问题在于代码点超过了0xFFFF,这意味着它不能直接表示为Java char。

经过一番研究,这是一个快速而肮脏的测试程序。

Character.toChars转换为char数组 我们用它构造一个字符串;

然后

getBytes()将其转换为UTF-8字节。

即使String使用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
相关问题