Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中用外来字符替换英文字符的方法?_Java_String_Special Characters_Character - Fatal编程技术网

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

在Java中用外来字符替换英文字符的方法?,java,string,special-characters,character,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字符串方法“replace”似乎不接受数组作为输入。有没有一种方法可以做到这一点(而不必求助于for

在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字符串方法“replace”似乎不接受数组作为输入。有没有一种方法可以做到这一点(而不必求助于for循环来遍历数组)


请说明是否有比我尝试的方法更优雅的方法。

您必须执行循环:

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();
String text=“我是你的朋友”;
Map replace=newhashmap();
替换;
替换。放置(‘i’,‘i’);
替换.put('è',e”);
StringBuilder s=新的StringBuilder();

对于(int i=0;i据我所知,没有标准方法,但这里有一个类可以满足您的需要:

您需要一个循环

有效的解决方案如下所示:

    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();
Map Map=newhashmap();
map.put('e','e');
map.put(‘i’、‘i’);
map.put('è','e');
StringBuilder b=新的StringBuilder();
for(char c:text.toCharArray())
{
if(图c)
{
b、 追加(map.get(c));
}
其他的
{
b、 附加(c);
}
}
字符串结果=b.toString();

当然,在一个实际的程序中,您可以将映射的构造和替换都封装在各自的方法中。

在标准API中没有与PHP方法相同的方法,尽管Apache Commons中可能有一些方法。您可以通过单独替换字符来实现:

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

一种更复杂的方法,它不需要您枚举要替换的字符(因此更可能不会遗漏任何内容),但需要一个循环(不管您使用什么方法,它都会在内部发生)将使用
java.text.Normalizer
来分离字母和变音符号,然后使用
字符类型character.MODIFIER\u LETTER

一种非常好的方法是使用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

我不是Java爱好者,但我推荐一种通用解决方案,使用分解重音字符,然后删除“组合”字符。

Java除外。(抱歉,无法抗拒。)呃。请不要使用基于regexp的方法。再看一眼,如果你想用多个字符替换单个字符,我想你必须这样做,但我不确定OP是否愿意。它必须在每个区域设置的基础上实现,并且可能会以一个特别的混乱结束-我不认为所有语言都有明确的规则来定义替换像德语那样的重音字符。这对于长字符串(O(n^2))来说效率很低,因为对于每个重音字符,整个字符串都会被遍历。Michael Borgwardt提到去掉character.MODIFIER_字母字符。是哪一个字符,或者你基本上是指同一个字符?形式上是Unicode类别Lm,它对应于哪个character.MODIFIER_字母。这显然是这里需要的:。类别Mc“标记,空格组合”似乎只适用于某些亚洲语言。我指的是名称中包含“组合”的Unicode字符。根据Michael的linkJonik/Michael,这似乎是Mn类别(标记,非空格):仅删除Lm对像“Æ”这样的组合字母不起作用。你必须做一个“KD”"在删除Lm之前进行规范化。很少值得为一个实现起来微不足道的函数添加库依赖项。实现起来微不足道,测试起来也不那么简单。通过使用像commons lang这样广泛使用的库,您可以有理由相信它工作得很好。您也可以说,很少值得重新实现一个实用程序y(添加更多自己的代码以进行测试和维护),而在一个广泛使用的库中已经存在一个非常好的实现。几乎可以肯定,Apache Commons中对您的项目有用的函数远远不止这一个。@Michael:我同意;尽管您可能是指Commons中的函数(因为ApacheCommons由几个独立发布的库组成)。@Harry,你能在回答->“在ApacheCommonsLang2.4中”中纠正这个问题吗