【问题标题】:How to convert Unicode to bytes in Java?如何在 Java 中将 Unicode 转换为字节?
【发布时间】:2019-07-03 00:09:50
【问题描述】:

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

【问题讨论】:

标签: java unicode type-conversion


【解决方案1】:

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

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

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

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

【讨论】:

  • 隐式假设将String“1f601”转换为int 1f601不需要解释。
  • 似乎它解决了一半的问题,你能不能像“1F601”这样的字符串输入并生成“new byte[]{(byte)0xF0,(byte)0x9F,(byte)0x98 ,(字节)0x81}" ?我试过这个没有用:int cp = Integer.parseInt("1f601")
  • 十六进制 -- Integer.parseInt("1f601", 16)
猜你喜欢
  • 2011-09-06
  • 2015-07-20
  • 1970-01-01
  • 2013-02-05
  • 2021-08-30
  • 1970-01-01
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多