如何使用其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)
.
该ICU4J库可以帮助你在这里.它有一类UCharacter
具有getCharFromName
和其他相关方法,可以从不同类型的角色名字符串返回的地图int
,他们表示代码点.
但是,如果您正在使用硬编码字符名称(即源代码中引用的字符串文字),那么进行一次翻译会更有效 - \u
在源代码中使用escape并添加带有全名的注释必要 - 而不是每次都在运行时产生解析名称表的成本.如果字符名称来自于读取文件或类似文件,那么显然您必须在运行时进行转换.
对于 JDK 9 及更高版本,使用静态方法Character.codePointOf(String name)
是最简单的方法:
\n\n\n公共静态 int codePointOf\xe2\x80\x8b(字符串名称)
\n\n返回给定 Unicode 字符名称指定的 Unicode 字符的代码点值。
\n
这适用于所有 Uniocde 字符,而不仅仅是基本多语言平面中的字符。例如,在 Java 12 上运行此代码...
\n\nString 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\nUnicode 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\nCharacter.getName(codepoint)
Character.toString(codepoint)
Character.codePointOf(name)
Character.toString(Character.codePointOf("LATIN SMALL LETTER A WITH DIAERESIS"));
。笔记:
\n\nIllegalArgumentException
在调用时将得到Character.codePointOf("DNA Double Helix")
. 归档时间: |
|
查看次数: |
1652 次 |
最近记录: |