2013-08-21 119 views
3

Recentrly刪除口音,我發現非常有用的方法StringUtils的圖書館是從字符串

StringUtils.stripAccents(String s) 

我發現它真的有用以消除任何特殊字符並將其轉換爲一些ASCII「等價物」,對於instace C = C等

現在我正在爲德國客戶誰真的需要做這樣的事情,但只爲非德語字符工作。任何變音都應該保持不變。我意識到在這種情況下,絃樂器不會有用。

有沒有人有這方面的經驗? 是否有任何有用的工具/庫/類或正則表達式? 我試着寫一些類,這是分析和更換等字符,但它可以建立這樣的地圖所有的語言非常困難......

任何建議appriciated ...

回答

1

我的直覺告訴我,最簡單的方法是隻列出允許的字符並去掉所有其他字符。這將是像

import java.util.regex.*; 
import java.text.*; 

public class Replacement { 
    private static String patternContainingAllValidGermanCharacters = 
              "a-zA-Z0-9äÄöÖéÉüÜß"; 

    public static void main(String args[]) { 
     String from = "aoeåöäìé"; 
     String result = stripAccentsFromNonGermanCharacters(from); 

     System.out.println("Result: " + result); 
    } 

    public static String stripAccentsFromNonGermanCharacters(
      String from) { 
     Pattern nonGermanCharactersPattern = Pattern.compile(
      "([^" + patternContainingAllValidGermanCharacters + "])"); 

     return stripAccentsFromCharactersMatching(
      from, nonGermanCharactersPattern); 

    } 

    public static String stripAccentsFromCharactersMatching(
     String target, Pattern myPattern) { 

     StringBuffer myStringBuffer = new StringBuffer(); 
     Matcher myMatcher = myPattern.matcher(target); 
     while (myMatcher.find()) { 
      myMatcher.appendReplacement(myStringBuffer, 
       stripAccents(myMatcher.group(1))); 
     } 
     myMatcher.appendTail(myStringBuffer); 

     return myStringBuffer.toString(); 
    } 


    // pretty much the same thing as StringUtils.stripAccents(String s) 
    // used here so I can demonstrate the code without StringUtils dependency 
    public static String stripAccents(String text) { 
     return Normalizer.normalize(text, 
      Normalizer.Form.NFD) 
      .replaceAll("\\p{InCombiningDiacriticalMarks}+", ""); 
    } 
} 

(我知道的模式不包含可能需要的所有字符,但添加任何缺失)

0

This可能圍繞給你的工作。在這裏您可以檢測語言並僅獲取特定文本。

編輯: 你可以有原始字符串作爲輸入,把語言檢測到德國,然後將檢測到德國的字符,並丟棄剩下的。

+0

它似乎有檢測所使用的語言的功能。你能澄清這將如何幫助? – eis

+0

你可以有原始字符串作爲輸入,把語言檢測到德國,然後將檢測到德國的字符,並丟棄剩餘 –

2

最好構建了一個自定義函數。它可以像下面這樣。如果您想避免轉換字符,則可以刪除兩個字符串(常量)之間的關係

private static final String UNICODE = 
     "ÀàÈèÌìÒòÙùÁáÉéÍíÓóÚúÝýÂâÊêÎîÔôÛûŶŷÃãÕõÑñÄäËëÏïÖöÜüŸÿÅåÇçŐőŰű"; 
private static final String PLAIN_ASCII = 
     "AaEeIiOoUuAaEeIiOoUuYyAaEeIiOoUuYyAaOoNnAaEeIiOoUuYyAaCcOoUu"; 

public static String toAsciiString(String str) { 
    if (str == null) { 
     return null; 
    } 
    StringBuilder sb = new StringBuilder(); 
    for (int index = 0; index < str.length(); index++) { 
     char c = str.charAt(index); 
     int pos = UNICODE.indexOf(c); 
     if (pos > -1) 
      sb.append(PLAIN_ASCII.charAt(pos)); 
     else { 
      sb.append(c); 
     } 
    } 
    return sb.toString(); 
} 

public static void main(String[] args) { 
    System.out.println(toAsciiString("Höchstalemannisch")); 
}