如何知道字符串是否包含重音符号?
3 回答
我认为你能做的最好的事情是使用一个规范器,将带有重音的 unicode 字符分成两个单独的字符。Java 在类中包含此内容Normalizer
,请参见此处。
例如,这将分裂
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
是否有一些重音字符(这意味着对它们进行硬编码)或者只是检查规范化版本是否等于起始版本,这意味着没有任何字符被分解. JavaNormalizer
已经在 中提供了这种功能isNormalized(CharSequence src, Normalizer.Form form)
,但是您应该检查各种可用的表格,看看是否有一种适合您的需要。
编辑:如果您只需要基本的口音支持(例如 è é à ò ì ù),您可以使用 oedo 选项,如果您需要对所有现有口音的完全支持,那么硬编码它们会很疯狂。
if (Pattern.matches(".*[éèàù].*", input)) {
....
}
将您想要的任何口音添加到该列表中
正确的做法是使用normalize(str,NFD)
from java.text.Normalizer
,然后删除一般类别 Mark\pM
或 Non-Spacing Mark的字符\p{Mn}
。Java 不支持标准的 Unicode 属性\p{Diacritic}
,或者您可以使用它。请注意,并非所有变音符号都是非间距标记,反之亦然。
但是,这可能是错误的做法。如果您尝试进行不区分重音的字符串搜索和比较,那么正确的做法是让字符串保持原样。您需要创建一个级别设置为 1(或者更确切地说是 PRIMARY)的 UCA 归类对象,然后使用它来比较您的字符串。如果字符串在主要强度上比较相等,它会忽略重音符号之类的东西。
以下是Java 中的示例,说明如何使用 ICU 的 Collator 类来做到这一点。如果您使用正确的UCA collators,那么您不必进行规范化;他们会为您解决这个问题。
Perl 中的这个答案使用了两个 UCA 整理器对象,一个主要优势是完全忽略字符串搜索和比较的重音符号,另一个允许像 Unicode 一样以次要优势区分变音符号。