Способ замены иностранных символов на Java на Java?
В 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, чтобы пройти через массив)?
Скажите, есть ли более элегантный способ, чем метод, который я пытаюсь сделать.
Ответы
Ответ 1
Действительно хороший способ сделать это - использовать 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
Нет никакого метода, который работает одинаково с PHP в стандартном API, хотя может быть что-то в Apache Commons. Вы можете сделать это, заменив символы индивидуально:
s = s.replace('é','e').replace('î', 'i').replace('è', 'e');
Более сложный метод, который не требует, чтобы вы перечисляли символы для замены (и, следовательно, более вероятно, чтобы ничего не пропустить), но требует цикла (который будет происходить в любом случае внутри, независимо от используемого вами метода) java.text.Normalizer
, чтобы отделить буквы и диакритики, а затем вычеркнуть все с типом символа Character.MODIFIER_LETTER
.
Ответ 3
Я не парень Java, но я бы рекомендовал общее решение, используя класс Normalizer для разложения ударных символов, а затем удалить Unicode "КОМБИНИРОВАТЬ" символы.
Ответ 4
Вам нужно сделать цикл:
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-умлаут преобразуется в "ue".
Изменить: Улучшено .
Ответ 5
Нет стандартного метода, насколько я знаю, но вот класс, который делает то, что вы хотите:
http://www.javalobby.org/java/forums/t19704.html
Ответ 6
Вам понадобится цикл.
Эффективное решение будет выглядеть примерно так:
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();
Конечно, в реальной программе вы должны инкапсулировать как конструкцию карты, так и замену в своих соответствующих методах.