Способ замены иностранных символов английского языка в Java? - PullRequest
2 голосов
/ 19 июня 2009

В PHP я бы использовал это:

$text = "Je prends une thé chaud, s'il vous plaît";
$search = array('é','î','è'); // etc.
$replace = array('e','i','e'); // etc.
$text = str_replace($search, $replace, $text); 

Но метод Java String "replace", похоже, не принимает массивы в качестве входных данных. Есть ли способ сделать это (не прибегая к циклу for, чтобы пройти через массив)?

Скажите, пожалуйста, есть ли более элегантный способ, чем тот, который я пытаюсь использовать?

Ответы [ 6 ]

3 голосов
/ 19 июня 2009

Действительно хороший способ сделать это - использовать метод replaceEach() из класса StringUtils в Apache Commons Lang 2.4.

String text = "Je prends une thé chaud, s'il vous plaît";
String[] search = new String[] {"é", "î", "è"};
String[] replace = new String[] {"e", "i", "e"};
String newText = StringUtils.replaceEach(text, 
                search, 
                replace);

Результаты в

Je prends une the chaud, s'il vous plait
2 голосов
/ 19 июня 2009

Я не Java-парень, но я бы порекомендовал универсальное решение, использующее класс Normalizer для разложения акцентированных символов, а затем удаления Unicode"КОМБИНИРОВАННЫХ" символов.

2 голосов
/ 19 июня 2009

В стандартном API нет метода, который бы работал так же, как PHP, хотя в Apache Commons может быть что-то еще. Вы можете сделать это, заменив символы по отдельности:

s = s.replace('é','e').replace('î', 'i').replace('è', 'e');

Более сложный метод, который не требует перечисления заменяемых символов (и, следовательно, с большей вероятностью ничего не пропустит), но требует цикла (который все равно будет происходить внутри, независимо от используемого вами метода). java.text.Normalizer, чтобы отделить буквы и диакритические знаки, а затем вычеркнуть все с типом символа Character.MODIFIER_LETTER.

1 голос
/ 19 июня 2009

Вам нужно сделать цикл:

String text = "Je prends une thé chaud, s'il vous plaît";
Map<Character, String> replace = new HashMap<Character, String>();
replace.put('é', "e");
replace.put('î', "i");
replace.put('è', "e");
StringBuilder s = new StringBuilder();
for (int i=0; i<text.length(); i++) {
  char c = text.charAt(i);
  String rep = replace.get(c);
  if (rep == null) {
    s.append(c);
  } else {
    s.append(rep);
  }
}
text = s.toString();

Примечание: Некоторые символы заменены на несколько символов. Например, в немецком языке u-umlaut преобразуется в «ue».

Редактировать: Сделано намного более эффективно.

0 голосов
/ 19 июня 2009

Вам понадобится петля.

Эффективным решением будет что-то вроде следующего:

    Map<Character, Character> map = new HashMap<Character, Character>();
    map.put('é', 'e');
    map.put('î', 'i');
    map.put('è', 'e');

    StringBuilder b = new StringBuilder();
    for (char c : text.toCharArray())
    {
        if (map.containsKey(c))
        {
            b.append(map.get(c));
        }
        else
        {
            b.append(c);
        }
    }
    String result = b.toString();

Конечно, в реальной программе вы должны инкапсулировать как построение карты, так и замену в их соответствующих методах.

0 голосов
/ 19 июня 2009

Насколько я знаю, стандартного метода не существует, но вот класс, который делает то, что вы хотите:

http://www.javalobby.org/java/forums/t19704.html

...