我正在寻找一种方法来检测java字符串中的字符"是否是一个组合字符"或不。例如,
String khmerCombiningVowel =
new String(new byte[]{(byte) 0xe1,(byte) 0x9f,(byte) 0x80}, "UTF-8"); // unicode 17c0
代表combining Khmer vowel sign。我尝试过"\\p{InCombiningDiacriticalMarks}"
regex,但它似乎并不适用于这些特殊的组合字符。或者即使有一些所有unicode组合字符块的综合列表,我也可以为它们制作一个正则表达式?
答案 0 :(得分:5)
根据Algorithm to check for combining characters in Unicode,有许多用于组合字符的块。
Java有许多有用的功能,请尝试:
String codePointStr = new String(new byte[]{(byte) 0xe1, (byte) 0x9f, (byte) 0x80}, "UTF-8"); // unicode 17c0
System.out.println(codePointStr.matches("\\p{Mc}"));
System.out.println(
Character.COMBINING_SPACING_MARK == Character.getType(codePointStr.codePointAt(0)));
(在两种情况下都打印为真)
在这种情况下,COMBINING_SPACING_MARK(和相关的正则表达式\p{gc=Mc}
)都引用Unicode category"标记,间距合并"这基本上是任何与前一个角色结合的角色,同时也增加了宽度。
其他可能有用的正则表达式:any kind of mark \p{M}
。如果要使用Character getType()
常量,可以通过检查其类型是COMBINING_SPACING_MARK
还是ENCLOSING_MARK
还是NON_SPACING_MARK
来获得相同的行为。
ENCLOSING_MARK是一个周围的角色,就像一个圆圈 - 也为它结合的角色增加了宽度。
NON_SPACING_MARK包括拉丁字母变音符号组合标记等(标记基本上位于顶部或底部,并且不为字符添加任何宽度)。