检测 Java 中的任何组合字符
detect any combining character in Java
我正在寻找一种方法来检测 java 字符串中的字符是否 "is a combining character"。例如,
String khmerCombiningVowel =
new String(new byte[]{(byte) 0xe1,(byte) 0x9f,(byte) 0x80}, "UTF-8"); // unicode 17c0
表示 combining Khmer vowel sign. I have tried "\p{InCombiningDiacriticalMarks}"
regex 但它似乎不适用于这些特定的组合字符。或者即使有所有 unicode 组合字符块的综合列表,我也可以为它们制作一个正则表达式?
根据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 (and related regex \p{gc=Mc}
) both refer to the Unicode category "Mark, Spacing Combining" 基本上是与前一个字符组合同时还增加了宽度的任何字符。
其他可能有用的正则表达式:\p{M}
for any kind of mark。如果您想使用字符 getType()
常量,您可以通过检查其类型是 COMBINING_SPACING_MARK
或 ENCLOSING_MARK
还是 NON_SPACING_MARK
.[=21 来获得相同的行为=]
ENCLOSING_MARK 是一个环绕的字符,就像一个圆圈——也增加了与它结合的字符的宽度。
NON_SPACING_MARK包括拉丁字母变音组合标记等(基本上在上面或下面的标记,不增加字符的宽度)。
我正在寻找一种方法来检测 java 字符串中的字符是否 "is a combining character"。例如,
String khmerCombiningVowel =
new String(new byte[]{(byte) 0xe1,(byte) 0x9f,(byte) 0x80}, "UTF-8"); // unicode 17c0
表示 combining Khmer vowel sign. I have tried "\p{InCombiningDiacriticalMarks}"
regex 但它似乎不适用于这些特定的组合字符。或者即使有所有 unicode 组合字符块的综合列表,我也可以为它们制作一个正则表达式?
根据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 (and related regex \p{gc=Mc}
) both refer to the Unicode category "Mark, Spacing Combining" 基本上是与前一个字符组合同时还增加了宽度的任何字符。
其他可能有用的正则表达式:\p{M}
for any kind of mark。如果您想使用字符 getType()
常量,您可以通过检查其类型是 COMBINING_SPACING_MARK
或 ENCLOSING_MARK
还是 NON_SPACING_MARK
.[=21 来获得相同的行为=]
ENCLOSING_MARK 是一个环绕的字符,就像一个圆圈——也增加了与它结合的字符的宽度。
NON_SPACING_MARK包括拉丁字母变音组合标记等(基本上在上面或下面的标记,不增加字符的宽度)。