2011-12-15 11 views
32

से एक्सेंट्स निकालें क्या एंड्रॉइड में कोई तरीका है कि (मेरे ज्ञान के लिए) में स्ट्रिंग से किसी भी उच्चारण को हटाने के लिए java.text.Normalizer नहीं है। E.g "éàù" "eau" बन जाता है।स्ट्रिंग

यदि संभव हो तो प्रत्येक चरित्र की जांच करने के लिए मैं स्ट्रिंग को पार्स करना से बचना चाहता हूं!

+2

एंड्रॉयड [java.text.Normalizer] है (http://developer.android.com/reference/java/text: आप संरक्षित करना चाहते हैं इन इस कोड (जहां string सरल करने के लिए स्ट्रिंग है) की कोशिश /Normalizer.html) यदि आप इसका उपयोग कर रहे हैं (या बाद में) एपीआई स्तर 9 से शुरू करते हैं। – eldarerathis

+2

http://stackoverflow.com/questions/6328654/android-2-3-and-java-text-normalizer – cyborg

+1

का संभावित डुप्लिकेट यदि आप सॉर्ट या मिलान कर रहे हैं, तो ['कोलेटर'] (http://docs.oracle.com/javase/6/docs/api/java/text/Collator.html); यह तब तक उच्चारण को अलग करने से बेहतर है जब तक आपको परिणाम प्रदर्शित करने की आवश्यकता न हो। – erickson

उत्तर

74

java.text.Normalizer एंड्रॉइड में (वैसे भी नवीनतम संस्करणों पर) है। आप इसका उपयोग कर सकते हैं।

string = Normalizer.normalize(string, Normalizer.Form.NFD); 
string = string.replaceAll("[^\\p{ASCII}]", ""); 

+2

मैं पुराने उपकरणों के साथ संगतता के लिए एपीआई स्तर 7 के साथ कोड करने की कोशिश कर रहा हूं और मुझे नहीं लगता कि यह – Johann

+0

है क्या आप उच्चारण को हटाने के लिए 'Normalizer.normalize' को कॉल करने के तरीके पर एक उदाहरण पोस्ट कर सकते हैं? –

+0

मैंने भविष्य के संदर्भ – Guillaume

0

सभी उच्चारण चार्टर्ड 127 से अधिक दशमलव मानों के साथ विस्तारित ASCII वर्ण कोड सेट में हैं। तो आप स्ट्रिंग में सभी वर्णों का आकलन कर सकते हैं और यदि दशमलव वर्ण कोड मान 127 से अधिक है, तो इसे वापस अपने मानचित्र पर भेजें वांछित समकक्ष। गैर-उच्चारण वाले समकक्षों पर उच्चारण किए गए अक्षरों को वापस मैप करने का कोई आसान तरीका नहीं है - आपको विस्तारित दशमलव कोड को वापस असंबद्ध वर्णों पर मानचित्रित करने के लिए स्मृति में किसी प्रकार का मानचित्र रखना होगा।

2

(नीचे टिप्पणी में लिंक से चिपकाया) यह शायद सबसे कुशल समाधान नहीं है बल्कि यह करना होगा:

संपादित संदर्भ के लिए, Normalizer उपयोग करने के लिए कैसे है चाल और यह सब Android संस्करण में काम करता है:

private static Map<Character, Character> MAP_NORM; 
static { // Greek characters normalization 
    MAP_NORM = new HashMap<Character, Character>(); 
    MAP_NORM.put('ά', 'α'); 
    MAP_NORM.put('έ', 'ε'); 
    MAP_NORM.put('ί', 'ι'); 
    MAP_NORM.put('ό', 'ο'); 
    MAP_NORM.put('ύ', 'υ'); 
    MAP_NORM.put('ή', 'η'); 
    MAP_NORM.put('ς', 'σ'); 
    MAP_NORM.put('ώ', 'ω'); 
    MAP_NORM.put('Ά', 'α'); 
    MAP_NORM.put('Έ', 'ε'); 
    MAP_NORM.put('Ί', 'ι'); 
    MAP_NORM.put('Ό', 'ο'); 
    MAP_NORM.put('Ύ', 'υ'); 
    MAP_NORM.put('Ή', 'η'); 
    MAP_NORM.put('Ώ', 'ω'); 
} 

public static String removeAccents(String s) { 
    if (s == null) { 
     return null; 
    } 
    StringBuilder sb = new StringBuilder(s); 

    for(int i = 0; i < s.length(); i++) { 
     Character c = MAP_NORM.get(sb.charAt(i)); 
     if(c != null) { 
      sb.setCharAt(i, c.charValue()); 
     } 
    } 

    return sb.toString(); 
} 
4

मैं अपने आवश्यकताओं के रबी के समाधान ajusted है, मैं यह ज आशा elps किसी:

private static Map<Character, Character> MAP_NORM; 
public static String removeAccents(String value) 
{ 
    if (MAP_NORM == null || MAP_NORM.size() == 0) 
    { 
     MAP_NORM = new HashMap<Character, Character>(); 
     MAP_NORM.put('À', 'A'); 
     MAP_NORM.put('Á', 'A'); 
     MAP_NORM.put('Â', 'A'); 
     MAP_NORM.put('Ã', 'A'); 
     MAP_NORM.put('Ä', 'A'); 
     MAP_NORM.put('È', 'E'); 
     MAP_NORM.put('É', 'E'); 
     MAP_NORM.put('Ê', 'E'); 
     MAP_NORM.put('Ë', 'E'); 
     MAP_NORM.put('Í', 'I'); 
     MAP_NORM.put('Ì', 'I'); 
     MAP_NORM.put('Î', 'I'); 
     MAP_NORM.put('Ï', 'I'); 
     MAP_NORM.put('Ù', 'U'); 
     MAP_NORM.put('Ú', 'U'); 
     MAP_NORM.put('Û', 'U'); 
     MAP_NORM.put('Ü', 'U'); 
     MAP_NORM.put('Ò', 'O'); 
     MAP_NORM.put('Ó', 'O'); 
     MAP_NORM.put('Ô', 'O'); 
     MAP_NORM.put('Õ', 'O'); 
     MAP_NORM.put('Ö', 'O'); 
     MAP_NORM.put('Ñ', 'N'); 
     MAP_NORM.put('Ç', 'C'); 
     MAP_NORM.put('ª', 'A'); 
     MAP_NORM.put('º', 'O'); 
     MAP_NORM.put('§', 'S'); 
     MAP_NORM.put('³', '3'); 
     MAP_NORM.put('²', '2'); 
     MAP_NORM.put('¹', '1'); 
     MAP_NORM.put('à', 'a'); 
     MAP_NORM.put('á', 'a'); 
     MAP_NORM.put('â', 'a'); 
     MAP_NORM.put('ã', 'a'); 
     MAP_NORM.put('ä', 'a'); 
     MAP_NORM.put('è', 'e'); 
     MAP_NORM.put('é', 'e'); 
     MAP_NORM.put('ê', 'e'); 
     MAP_NORM.put('ë', 'e'); 
     MAP_NORM.put('í', 'i'); 
     MAP_NORM.put('ì', 'i'); 
     MAP_NORM.put('î', 'i'); 
     MAP_NORM.put('ï', 'i'); 
     MAP_NORM.put('ù', 'u'); 
     MAP_NORM.put('ú', 'u'); 
     MAP_NORM.put('û', 'u'); 
     MAP_NORM.put('ü', 'u'); 
     MAP_NORM.put('ò', 'o'); 
     MAP_NORM.put('ó', 'o'); 
     MAP_NORM.put('ô', 'o'); 
     MAP_NORM.put('õ', 'o'); 
     MAP_NORM.put('ö', 'o'); 
     MAP_NORM.put('ñ', 'n'); 
     MAP_NORM.put('ç', 'c'); 
    } 

    if (value == null) { 
     return ""; 
    } 

    StringBuilder sb = new StringBuilder(value); 

    for(int i = 0; i < value.length(); i++) { 
     Character c = MAP_NORM.get(sb.charAt(i)); 
     if(c != null) { 
      sb.setCharAt(i, c.charValue()); 
     } 
    } 

    return sb.toString(); 

} 
2

Guillaume का जवाब यह स्ट्रिंग से सभी गैर- ASCII वर्ण स्ट्रिप्स काम करता है।

// Convert input string to decomposed Unicode (NFD) so that the 
// diacritical marks used in many European scripts (such as the 
// "C WITH CIRCUMFLEX" → ĉ) become separate characters. 
// Also use compatibility decomposition (K) so that characters, 
// that have the exact same meaning as one or more other 
// characters (such as "㎏" → "kg" or "ヒ" → "ヒ"), match when 
// comparing them. 
string = Normalizer.normalize(string, Normalizer.Form.NFKD); 

StringBuilder result = new StringBuilder(); 

int offset = 0, strLen = string.length(); 
while(offset < strLen) { 
    int character = string.codePointAt(offset); 
    offset += Character.charCount(character); 

    // Only process characters that are not combining Unicode 
    // characters. This way all the decomposed diacritical marks 
    // (and some other not-that-important modifiers), that were 
    // part of the original string or produced by the NFKD 
    // normalizer above, disappear. 
    switch(Character.getType(character)) { 
     case Character.NON_SPACING_MARK: 
     case Character.COMBINING_SPACING_MARK: 
      // Some combining character found 
     break; 

     default: 
      result.appendCodePoint(Character.toLowerCase(character)); 
    } 
} 

// Since we stripped all combining Unicode characters in the 
// previous while-loop there should be no combining character 
// remaining in the string and the composed and decomposed 
// versions of the string should be equivalent. This also means 
// we do not need to convert the string back to composed Unicode 
// before returning it. 
return result.toString(); 
+0

यह ऊपरीकेस –

+0

खो देता है बेशक यह करता है। यदि आप अपर-केस को 'result.appendCodePoint (वर्ण) का उपयोग करना चाहते हैं, तो 'result.appendCodePoint (Character.toLowerCase (character)) के बजाय' '। ;-) – alexander255