【问题标题】:detect any combining character in Java检测Java中的任何组合字符
【发布时间】:2015-05-20 13:52:12
【问题描述】:

我正在寻找一种方法来检测 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 组合字符块的完整列表,我也可以为它们制作一个正则表达式?

【问题讨论】:

标签: java regex unicode combining-marks


【解决方案1】:

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

其他可能有用的正则表达式:\p{M} for any kind of mark。如果你想使用 Character getType() 常量,你可以通过检查它的类型是 COMBINING_SPACING_MARKENCLOSING_MARKNON_SPACING_MARK 来获得相同的行为。

ENCLOSING_MARK 是一个环绕字符,就像一个圆圈 - 也会增加与其组合的字符的宽度。

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

【讨论】:

    猜你喜欢
    • 2018-01-08
    • 2023-03-08
    • 2019-12-08
    • 2014-02-06
    • 2010-12-13
    • 2012-04-13
    • 2018-12-15
    • 1970-01-01
    • 2019-03-13
    相关资源
    最近更新 更多