检测Java中的任何组合字符

检测Java中的任何组合字符,java,regex,unicode,combining-marks,Java,Regex,Unicode,Combining Marks,我正在寻找一种方法来检测java字符串中的字符是否为“组合字符”。比如说, String khmerCombiningVowel = new String(new byte[]{(byte) 0xe1,(byte) 0x9f,(byte) 0x80}, "UTF-8"); // unicode 17c0 代表一个。我尝试了“\\p{InCombiningDiacriticalMarks}”,但它似乎不适用于这些特定的组合字符。或者,即使有一些关于所有unicode组合字符块的综合列表,我也

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

String khmerCombiningVowel = 
 new String(new byte[]{(byte) 0xe1,(byte) 0x9f,(byte) 0x80}, "UTF-8"); // unicode 17c0
代表一个。我尝试了
“\\p{InCombiningDiacriticalMarks}”
,但它似乎不适用于这些特定的组合字符。或者,即使有一些关于所有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)));
(在两种情况下均为真)

在这种情况下,(和相关的正则表达式
\p{gc=Mc}
)都指“标记,间距组合”,这基本上是指在增加宽度的同时与前一个字符组合的任何字符

其他可能有用的正则表达式:
\p{M}
for。如果要使用字符
getType()
常量,可以通过检查其类型是否为
组合间隔标记
封闭标记
非间隔标记
来获得与该字符相同的行为

封闭的_标记是一个环绕的字符,就像一个圆——也会增加它所组合的字符的宽度


包括拉丁字母变音符号组合标记等(基本上位于上方或下方的标记,并且不会为字符增加任何宽度)。

这里有一个指向组合变音符号块中所有Unicode字符的链接:是的,奇怪的是,这个字符似乎是一个组合标记,但在“组合变音符号”块之外。就像…也许是其他街区?