java - 将 unicode 符号转换为其代码

标签 java unicode

我有以下包含表情符号的 XML 文件:http://pastebin.com/8f0GeE96

现在,我想要的是将每个 unicode 字符转换为其代码(作为字符串)。为此,我编写了以下代码。问题是我得到了很多 dup(即 d83d),这让我认为我的解析有问题。对此有何解释?

public static void main(String[] args) {

        File file = new File("c:\\EmojisList.plist.txt");

        try {
            BufferedReader in = new BufferedReader(
                       new InputStreamReader(new FileInputStream(file), "UTF8"));

            String str;
            while ((str = in.readLine()) != null) { 
                if(str.trim().startsWith("<string>"))
                {
                    int emoji_pos = str.indexOf('>') + 1;
                    char emoji_char = str.charAt(emoji_pos);
                    String emoji_code_str = Integer.toHexString(emoji_char);

                    System.out.println(emoji_code_str);
                }

            }

            in.close();


        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

最佳答案

Unicode 标准始于一系列字符,16 位(两个字节)就足够了。

然而,越来越多的文字和符号被添加到其中,如今,你无法用16位来表达所有的字符。代码点的合法范围是从 U+0 到 U+10FFFF。

不幸的是,这不适合 Java char,它只有 16 位,能够表示 0 到 FFFF 的值。

大多数常见的西方语言都没有这个问题 - 拉丁语(包括重音)、俄语、阿拉伯语、希伯来语等的范围完全在 16 位范围内。即使是常见的中文和日文字符也在这个范围内。

但大多数表情符号实际上都在“扩展”范围内,在 unicode“杂项符号和象形文字”和“表情符号” block 中,范围分别为从 U+1F300 到 U+1F5FF 以及从 U+1F600 到 U+1F67F .

此范围内的字符使用 UTF-16 编码以字符串形式表示,该编码基本上为每个此类字符使用两个 char 值。因此,如果字符的代码点(其官方 unicode 值)在 U+10000 到 U+10FFFF 范围内,则有两个 char 值,其中一个值在 U+D800 到 U+D800 范围内U+DB7F(“高代理项”)和 U+DC00 到 U+DFFF 范围内的一个(“低代理项”)用于表示它。

因此,当您在程序中读取 charAt(emoji_pos) 的值时,您实际上只读取了实际字符的前半部分。事实上,“表情符号”范围内的所有表情符号都具有 U+D83D 的高代理特征。

因此,要获取表情符号的实际 Unicode 代码点,您需要将 UTF-16 表示形式转换为实际的 int 值。一个 char 是不够的。您可以通过使用 StringCharacter 类中可用的方法来完成此操作。

在这种情况下,您可以简单地使用 codePointAt 而不是使用 charAt方法。

所以,而不是

char emoji_char = str.charAt(emoji_pos);

用途:

int emojiCodePoint = str.codePoint(emojiPos);

有关更多信息,请阅读 UTF FAQ在 Unicode 联盟的网站上。

<小时/>

注意:Java 编码约定是变量、字段和方法名称应采用小驼峰式命名:第一个单词以小写字母开头,其他单词以大写字母开头,并且没有下划线。因此变量名称应该是 emojiCodePoint,而不是 emoji_code_point。下划线仅在常量名称中可接受,且常量名称全部大写(例如 CASE_INSENSITIVE_ORDER)。

关于java - 将 unicode 符号转换为其代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33320058/

相关文章:

python - 在 python 中使用马拉雅拉姆语 unicode

java - 如何确保Android应用程序正在访问真实服务器

java - 将 Java applet 项目导入 netbeans 将无法正常工作,即使手动设置,Netbeans 也拒绝识别甚至找不到主类

java - 将 JavaFX 桌面应用程序转换为 Web 应用程序

python - u'Georges Méliès' vs u'Georges M\xe9li\xe8s'

python - 关于带有特殊字符的 len str

python - 检查可打印的 Unicode

java - 安卓/java : stop a method from returning value until a part of the method is executed

java - 将 JUnit 测试方法放入测试类中是一种不好的做法吗?

c++ - unicode 窗口中的非 unicode WM_CHAR