2

我正在寻找一种方法来检测java字符串中的字符是否“是组合字符”。例如,

String khmerCombiningVowel = 
 new String(new byte[]{(byte) 0xe1,(byte) 0x9f,(byte) 0x80}, "UTF-8"); // unicode 17c0

表示组合高棉元音符号。我已经尝试过"\\p{InCombiningDiacriticalMarks}" 正则表达式,但它似乎不适用于这些特定的组合字符。或者即使有所有 unicode 组合字符块的完整列表,我也可以为它们制作一个正则表达式?

4

1 回答 1

5

根据检查 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 类别“标记,间距组合”,它基本上是与前一个字符组合同时还增加宽度的任何字符。

其他可能有用的正则表达式:\p{M}对于任何类型的标记。如果要使用 CharactergetType()常量,可以通过检查其类型是否为COMBINING_SPACING_MARKorENCLOSING_MARK或来获得相同的行为NON_SPACING_MARK

ENCLOSING_MARK 是一个环绕的字符,就像一个圆圈——也增加了与它组合的字符的宽度。

NON_SPACING_MARK包括拉丁字母变音组合标记等(标记基本上在顶部或底部,并且不给字符添加任何宽度)。

于 2015-03-17T22:42:43.867 回答