如何知道字符串是否包含重音符号

时间:2010-05-05 14:56:25

标签: java string unicode diacritics

如何知道字符串是否包含重音?

3 个答案:

答案 0 :(得分:13)

我认为你能做的最好的事情就是使用一个规范化器,它将带有重音的unicode字符分成两个独立的字符。 Java在课程Normalizer中包含此内容,请参阅here

例如,这将分裂

U+00C1    LATIN CAPITAL LETTER A WITH ACUTE

U+0041    LATIN CAPITAL LETTER A
U+0301    COMBINING ACUTE ACCENT

并将对每个带有重音符号或其他变音符号(http://en.wikipedia.org/wiki/Diacritic)的字符执行此操作。

然后你可以检查结果CharSequence是否有一些重音符号(这意味着硬编码)或者只是检查标准化版本是否等于起始版本,这意味着没有任何已被分解的角色。 Java Normalizer已在isNormalized(CharSequence src, Normalizer.Form form)中使用此工具,但您应该检查各种可用表单,看看是否有适合您需求的表单。

编辑:如果你只需要基本的重音支持(比如èéàòù),你可以选择oedo选项,如果你需要完全支持所有现有的口音,那么它将是疯狂地对它们进行硬编码..

答案 1 :(得分:5)

if (Pattern.matches(".*[éèàù].*", input)) {
  ....
}

将您想要的任何重音添加到该列表

答案 2 :(得分:5)

执行此操作的正确方法是使用normalize(str,NFD)中的java.text.Normalizer,然后删除常规类别标记\pM或非间距标记\p{Mn}的字符。 Java不支持标准Unicode属性\p{Diacritic},或者您可以使用它。请注意,并非所有变音符号都是非间距标记,反之亦然。

然而,这可能是错误的做法。如果您尝试进行不区分重音的字符串搜索和比较,那么正确的方法是将字符串保留原样。您需要创建一个UCA归类对象,其级别设置为1(或者更确切地说是PRIMARY),然后使用它来比较您的字符串。如果字符串在主要强度上比较相等,则忽略重音符号等内容。

Java中的

Here are examples如何使用ICU的Collat​​or类进行操作。如果您使用正确的UCA collators,则无需进行规范化;他们为你照顾这个。

Perl中的

This answer使用两个UCA collat​​or对象,一个主要强度完全忽略字符串搜索和比较的重音,另一个允许在二次强度下区分变音符号,这是Unicode的正常情况。 / p>