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

2022-09-04 04:00:00

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

例如,如果

Character.getName('\u00e4')

返回 ,如何使用“普通”Java执行反向操作(即从到)?"LATIN SMALL LETTER A WITH DIAERESIS""LATIN SMALL LETTER A WITH DIAERESIS"'\u00e4'

编辑:为了阻止我想要或我不想要的评论洪流,这是我在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

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

而且,顺便说一句,我不想“打印unicode转义” - 实际上为char获取十六进制很容易,但我想要一个带有名字的char。

换句话说我想做相反的事情。Character.getName(int)


答案 1

ICU4J库可以在这里为您提供帮助。它有一个包含 getCharFromName 和其他相关方法的类,这些方法可以从各种类型的用户名字符串映射回它们表示的代码点。UCharacterint

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


答案 2

对于版本 JDK 9 及更高版本,使用静态方法 Character.codePointOf(字符串名称)是最简单的方法:

public static int codePointOf(字符串名称)

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

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

String s1 = "LATIN SMALL LETTER A WITH DIAERESIS";
int cp1 = Character.codePointOf(s1);
System.out.println("Unicode name \"" + Character.getName(cp1) + "\" => code point " + cp1 + " => character " + Character.toString(cp1));

String s2 = "EYES";
int cp2 = Character.codePointOf(s2);
System.out.println("Unicode name \"" + Character.getName(cp2) + "\" => code point " + cp2 + " => character " + Character.toString(cp2));

String s3 = "DNA Double Helix"; // Only works with JDK12 and later. Otherwise java.lang.IllegalArgumentException is thrown.
int cp3 = Character.codePointOf(s3);
System.out.println("Unicode name \"" + Character.getName(cp3) + "\" => code point " + cp3 + " => character " + Character.toString(cp3));

...产生此输出...

Unicode name "LATIN SMALL LETTER A WITH DIAERESIS" => code point 228 => character ä
Unicode name "EYES" => code point 128064 => character 						

推荐