1

我有一組數據,其中有重音ascii。我想將口音轉換爲純英文字母。我做到這一點用下面的代碼:使用Java Normalizer將口音ascii轉換爲非口音,但排除一些symboles

import java.text.Normalizer; 
import java.util.regex.Pattern; 

public String deAccent(String str) { 
    String nfdNormalizedString = Normalizer.normalize(str, Normalizer.Form.NFD); 
    Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+"); 
    return pattern.matcher(nfdNormalizedString).replaceAll(""); 
} 

但是這個代碼是缺少的是排除人物,我不知道我怎麼可以轉換排除某些字符,例如我要排除的信「 ü「從杜塞爾多夫這個詞,所以當我轉換時,它不會變成杜塞爾多夫的話。有沒有辦法將排除列表傳遞給方法或匹配器,並且不轉換某些重音字符?

+0

我刪除了時髦的標籤,因爲這看起來像一個純Java的問題 –

+0

當然沒問題,但我認爲Java和Groovy代碼是非常相似的,所以Groovy的傢伙可以提供一些解決方案以及。 – AlexCon

回答

3

不要使用規範化去除口音!

  • ł

  • đ

  • ħ

您也可以婉:

例如,下面的字母不使用你的方法asciified t將連字如œ分成單獨的字母(即, oe)。

試試這個:

private static final String TAB_00C0 = "" + 
     "AAAAAAACEEEEIIII" + 
     "DNOOOOO×OUUUÜYTs" + // <-- note an accented letter you wanted 
          //  and preserved multiplication sign 
     "aaaaaaaceeeeiiii" + 
     "dnooooo÷ouuuüyty" + // <-- note an accented letter and preserved division sign 
     "AaAaAaCcCcCcCcDd" + 
     "DdEeEeEeEeEeGgGg" + 
     "GgGgHhHhIiIiIiIi" + 
     "IiJjJjKkkLlLlLlL" + 
     "lLlNnNnNnnNnOoOo" + 
     "OoOoRrRrRrSsSsSs" + 
     "SsTtTtTtUuUuUuUu" + 
     "UuUuWwYyYZzZzZzs"; 

public static String toPlain(String source) { 
    StringBuilder sb = new StringBuilder(source.length()); 
    for (int i = 0; i < source.length(); i++) { 
     char c = source.charAt(i); 
     switch (c) { 
      case 'ß': 
       sb.append("ss"); 
       break; 
      case 'Œ': 
       sb.append("OE"); 
       break; 
      case 'œ': 
       sb.append("oe"); 
       break; 
      // insert more ligatures you want to support 
      // or other letters you want to convert in a non-standard way here 
      // I recommend to take a look at: æ þ ð fl fi 
      default: 
       if (c >= 0xc0 && c <= 0x17f) { 
        c = TAB_00C0.charAt(c - 0xc0); 
       } 
       sb.append(c); 
     } 
    } 
    return sb.toString(); 
}