如何知道字符串是否包含重音?
答案 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的Collator类进行操作。如果您使用正确的UCA collators,则无需进行规范化;他们为你照顾这个。
Perl中的This answer使用两个UCA collator对象,一个主要强度完全忽略字符串搜索和比较的重音,另一个允许在二次强度下区分变音符号,这是Unicode的正常情况。 / p>