2010-05-05 108 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的正常區別。

相關問題