用Java替换外来英文字符的方法?

时间:2009-06-19 08:45:16

标签: java string special-characters character

在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”似乎不接受数组作为输入。有没有办法做到这一点(不必求助于循环遍历数组)?

请说是否比我正在尝试的方法更优雅。

6 个答案:

答案 0 :(得分:3)

一个非常好的方法是使用Apache Commons Lang 2.4中的replaceEach() method from the StringUtils类。

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

答案 1 :(得分:2)

虽然Apache Commons中可能存在某些内容,但没有任何方法与标准API中的PHP相同。您可以通过单独替换字符来实现:

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

一种更复杂的方法,它不需要你枚举要替换的字符(因此更有可能不会遗漏任何东西)但是需要一个循环(无论如何在内部发生,无论你使用什么方法)都会使用java.text.Normalizer将字母和变音符号分开,然后删除字符类型为Character.MODIFIER_LETTER的所有内容。

答案 2 :(得分:2)

我不是Java人,但我建议使用Normalizer class分解重音字符的通用解决方案,然后删除Unicode“COMBINING”字符。

答案 3 :(得分:1)

你将不得不做一个循环:

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”。

修改:提高 效率。

答案 4 :(得分:0)

据我所知,目前还没有标准的方法,但是这里有一个可以做你想做的课:

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

答案 5 :(得分:0)

你需要一个循环。

有效的解决方案如下:

    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();

当然,在一个真实的程序中,你将封装地图的构造和各自方法中的替换。