如何通过Java中的(unicode)名称获取字符?我需要与Character.getName相反(int codePoint)

Pio*_*sen 11 java unicode

如何使用其Unicode名称在Java中查找字符或int代码点?

例如,如果

Character.getName('\u00e4')
Run Code Online (Sandbox Code Playgroud)

回报"LATIN SMALL LETTER A WITH DIAERESIS",我如何进行反向操作(即从去"LATIN SMALL LETTER A WITH DIAERESIS"'\u00e4'),使用"普通"的Java?

编辑:要停止我想要或不想要的评论洪流,这是我在Python中要做的:

"\N{LATIN SMALL LETTER A WITH DIAERESIS}" # this gives me what I want as a literal

unicodedata.lookup("LATIN SMALL LETTER A WITH DIAERESIS") # a dynamic version
Run Code Online (Sandbox Code Playgroud)

现在,问题是:在Java中做同样的事情.

而且,顺便说一句,我不想​​"打印unicode转义" - 实际上获取字符的十六进制很容易,但我想要一个名字的字母.

换句话说,我想反过来做什么Character.getName(int).

Ian*_*rts 5

ICU4J库可以帮助你在这里.它有一类UCharacter具有getCharFromName和其他相关方法,可以从不同类型的角色名字符串返回的地图int,他们表示代码点.

但是,如果您正在使用硬编码字符名称(即源代码中引用的字符串文字),那么进行一次翻译会更有效 - \u在源代码中使用escape并添加带有全名的注释必要 - 而不是每次都在运行时产生解析名称表的成本.如果字符名称来自于读取文件或类似文件,那么显然您必须在运行时进行转换.

  • @PiotrFindeisen正如其他答案所示,如果您不想使用第三方库,那么您基本上必须自己实现相同的算法集.是什么让你自己重新实现"普通Java"而不是使用已经为你完成工作的现有(广泛使用和测试)的开源库? (2认同)
  • Piotr,我不明白你反对依赖图书馆。大多数商业编写的 Java 代码都依赖于多个库。专业程序员认识到,重新发明轮子并不划算。无论您的问题是什么,如果其他人已经解决了它,那么就没有任何理由不使用他们的解决方案。 (2认同)

sko*_*isa 5

对于 JDK 9 及更高版本,使用静态方法Character.codePointOf(String name)是最简单的方法:

\n\n
\n

公共静态 int codePointOf\xe2\x80\x8b(字符串名称)

\n\n

返回给定 Unicode 字符名称指定的 Unicode 字符的代码点值。

\n
\n\n

这适用于所有 Uniocde 字符,而不仅仅是基本多语言平面中的字符。例如,在 Java 12 上运行此代码...

\n\n
String s1 = "LATIN SMALL LETTER A WITH DIAERESIS";\nint cp1 = Character.codePointOf(s1);\nSystem.out.println("Unicode name \\"" + Character.getName(cp1) + "\\" => code point " + cp1 + " => character " + Character.toString(cp1));\n\nString s2 = "EYES";\nint cp2 = Character.codePointOf(s2);\nSystem.out.println("Unicode name \\"" + Character.getName(cp2) + "\\" => code point " + cp2 + " => character " + Character.toString(cp2));\n\nString s3 = "DNA Double Helix"; // Only works with JDK12 and later. Otherwise java.lang.IllegalArgumentException is thrown.\nint cp3 = Character.codePointOf(s3);\nSystem.out.println("Unicode name \\"" + Character.getName(cp3) + "\\" => code point " + cp3 + " => character " + Character.toString(cp3));\n
Run Code Online (Sandbox Code Playgroud)\n\n

...产生这个输出...

\n\n
Unicode name "LATIN SMALL LETTER A WITH DIAERESIS" => code point 228 => character \xc3\xa4\nUnicode name "EYES" => code point 128064 => character \nUnicode name "DNA DOUBLE HELIX" => code point 129516 => character \n
Run Code Online (Sandbox Code Playgroud)\n\n

总结一下转换:

\n\n
    \n
  • 对于代码点 => Unicode 名称,请使用Character.getName(codepoint)
  • \n
  • 对于代码点 => 字符表示,请使用Character.toString(codepoint)
  • \n
  • 对于 Unicode 名称 => 代码点,请使用Character.codePointOf(name)
  • \n
  • 对于 Unicode name => 字符表示,当前不存在 JDK 方法。相反,使用 Unicode 名称的代码点间接执行此操作,如上所示。例如:Character.toString(Character.codePointOf("LATIN SMALL LETTER A WITH DIAERESIS"));
  • \n
\n\n

笔记:

\n\n
    \n
  • 确保所使用的 JDK 版本支持指定的 Unicode 名称。例如,Unicode 名称“DNA Double Helix”的字符已添加到 Unicode 11,该字符仅受 JDK 版本 >= 12 支持。如果您使用早期的 JDK 版本运行,则IllegalArgumentException在调用时将得到Character.codePointOf("DNA Double Helix").
  • \n
  • 如果显示白色方块来代替 Unicode 字符,请尝试更改字体(例如用于渲染表情符号字符的 Segoe UI 表情符号)。
  • \n
\n