2010-05-05 129 views
8

如何知道一个字符串是否包含口音?如何知道一个字符串是否包含口音

+0

'''口音?是“\'”一个口音? – kennytm 2010-05-05 14:58:00

+0

accents =èèèè... – Mercer 2010-05-05 14:58:28

+3

这不是一个答案。有很多很多的变音符号超出了你的想象:http://blogs.msdn.com/michkap/archive/2006/02/17/533929.aspx你必须根据“重音”来决定你的意思。这不像你想象的那么简单。 – 2010-05-05 15:15:50

回答

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

要将该列表

+1

你的速记将只适用于大小为1的输入。 – wds 2010-05-05 15:30:49

+0

*眨眼*我不知道我是如何错过的。谢谢!代码已被修复。 – oedo 2010-05-05 15:34:30

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)中有此功能,但您应该查看各种表单以查看是否有适合您的需求的表单。

编辑:如果你只需要基本的口音的支持(像是刚èE中的O I U)你可以去大江户选择,如果你需要为所有现有的口音全力支持,更是疯狂硬编码他们都..

+3

如果您在\ p {Mn}上匹配,我认为您可以过滤掉所有组合标记(这是标记的一般类别,非间隔)。 – wds 2010-05-05 15:27:29

5

要做到这一点是使用normalize(str,NFD)java.text.Normalizer,然后删除普通类马克\pM或无空格的字符的正确方法什么口音加马克\p{Mn}。 Java不支持标准Unicode属性\p{Diacritic}或者您可以使用它。请注意,并非所有的变音符号都是非间距符号,反之亦然。

但是,这可能是错误的事情。如果您尝试执行不区分重音的字符串搜索和比较,则正确的方法是将字符串保持原样。您需要创建一个级别设置为1(或者说,PRIMARY)的UCA排序规则对象,然后使用它来比较您的字符串。如果字符串在主要强度上比较相等,则忽略重音标记等内容。

Here are examples在Java中如何使用ICU的Collat​​or类来做到这一点。如果你使用正确的UCA collators,那么你不必规范化;他们为你照顾这件事。

This answer在Perl中使用了两个UCA collat​​or对象,一个用于主要强度以完全忽略用于字符串搜索和比较的重音符号,另一个用于允许区分次要强度的变音符号与Unicode的正常区别。

相关问题