我有以下代码将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: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");
答案 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