2015-09-22 3 views
5

Я пытаюсь преобразовать весь латинский Юникод Характера в их [a-z] представленийкак заменить латинский Юникод символа [AZ] символы

ó --> o 
í --> i 

Я могу легко сделать один за другим, например:

myString = myString.replaceAll("ó","o"); 

но так как существует множество вариаций, этот подход просто непрактичен

Есть ли другой способ сделать это на Java? например regular Expression или utility library

использования:

1- городские имена из других языков на английский язык, например,

Эспириту-Санту -> Эспириту-Санту,

+0

http://stackoverflow.com/a/25057742/984823 Но все-таки быть в курсе некоторых исключений, например, л-тактный. –

+0

Это очень грубый подход для вашего случая использования. На немецком языке в ситуациях, когда может отображаться только ASCII, умлаут заменяется на e после символа, например. Мюнхен становится Мюнхеном. И фактическое английское название этого города - Мюнхен. Я бы предложил просто оставить акценты. Если приложение не может отображать эти акценты, ваше приложение ужасно нарушается. – roeland

+0

@roeland да Я понимаю, что проблема заключается в том, что представьте себе München на разных языках, на каждом языке это по-другому. теперь представьте в больших данных, пытаясь проанализировать все эти данные ... ну, как я думаю, не может дать нам нужный город, но он по крайней мере пытается нормализовать его «как можно больше» (есть высказывание, если ставка более 80% его достаточно хорошо). это то, к чему мы стремимся – nafas

ответ

7

Этот ответ требует Java 1.6 или выше, который добавил java.text.Normalizer.

String normalized = Normalizer.normalize(input, Normalizer.Form.NFD); 
    String accentRemoved = normalized.replaceAll("\\p{InCombiningDiacriticalMarks}+", ""); 

Пример:

public class Main { 
    public static void main(String[] args) { 
     String input = "Árvíztűrő tükörfúrógép"; 
     System.out.println("Input: " + input); 
     String normalized = Normalizer.normalize(input, Normalizer.Form.NFD); 
     System.out.println("Normalized: " + normalized); 
     String accentRemoved = normalized.replaceAll("\\p{InCombiningDiacriticalMarks}+", ""); 
     System.out.println("Result: " + accentRemoved); 
    } 
} 

Результат:

Input: Árvíztűrő tükörfúrógép 
Result: Arvizturo tukorfurogep 
+0

@JoopEggen Я не знаю, как это работает, я просто знаю, что это работает :) – EpicPandaForce

+1

@EpicPandaForce Я не пытаюсь заменить их на "". Например, я хотите перепрофилировать «í» с «i» – nafas

+1

Первая нормализация заменяет один символ '' 'ASCII' i' plus zero-width'''. Затем все эти акценты, сочетающие диакритические знаки, удаляются. Оставайтесь буквами ASCII. D в NFD означает Decompose. –

Смежные вопросы