有效地替换字符串中所有不受支持的字符

时间:2012-10-20 18:02:14

标签: java android string replace

  

可能重复:
  Converting Symbols, Accent Letters to English Alphabet

我需要替换所有重音字符,例如

"à", "é", "ì", "ò", "ù"

"a'", "e'", "i'", "o'", "u'"...

因为在保存后用重音字符重新加载嵌套字符串时会出现问题。

有没有办法在不对所有字符使用不同的字符串替换的情况下执行此操作?

例如,我宁愿避免做

text  = text.replace("a", "a'");
text2 = text.replace("è", "e'");
text3 = text2.replace("ì", "i'");
text4 = text3.replace("ò", "o'");
text5 = text4.replace("ù", "u'");

4 个答案:

答案 0 :(得分:4)

如果您不介意将commons-lang添加为依赖项,请尝试StringUtils.replaceEach 我相信以下内容执行相同的任务:

import org.apache.commons.lang.StringUtils;

public class ReplaceEachTest
{
   public static void main(String [] args)
   {
      String text = "àéìòùàéìòù";
      String [] searchList = {"à", "é", "ì", "ò", "ù"};
      String [] replaceList = {"a'", "e'", "i'", "o'", "u'"};
      String newtext = StringUtils.replaceEach(text, searchList, replaceList);
      System.out.println(newtext);
   }
}

此示例打印a'e'i'o'u'a'e'i'o'u' 但总的来说,我同意,由于您要创建自定义字符翻译,因此您需要一个解决方案,明确指定每个感兴趣字符的替换。

我以前使用replaceChars的答案并不好,因为它只处理一对一的字符替换。

答案 1 :(得分:4)

我试过这个post它似乎有效。

String str= Normalizer.normalize(str, Normalizer.Form.NFD);
str= str.replaceAll("\\p{InCombiningDiacriticalMarks}+", "'");

编辑: 但是替换组合变音标记,有副作用,你无法区分À

答案 2 :(得分:3)

在阅读主要方法中的评论后,我认为更好的选择是修复问题 - 这与编码有关吗? - 而不是试图掩盖症状。

此外,这仍然需要手动显式映射,这可能使得它不如nandeesh使用正则表达式unicode字符类的答案理想。


以下是执行映射的代码框架。它比char-char稍微复杂一点。

此代码试图避免额外的字符串。它可能“或更高效”。尝试使用真实的数据/用法。 YMMV。

String mapAccentChar (char ch) {
    switch (ch) {
        case 'à': return "a'";
        // etc
    }
    return null;
}

String mapAccents (String input) {
  StringBuilder sb = new StringBuilder();
  int l = input.length();
  for (int i = 0; i < l; i++) {
    char ch = input.charAt(i);
    String mapped = mapAccentChar(ch);
    if (mapped != null) {
      sb.append(mapped);
    } else {
      sb.append(ch);
  }
  return sb.toString();
}

答案 3 :(得分:2)

由于char的ASCII值与其重音版本之间没有严格的关联,因此在您看来,您的替换方式是最直接的方式。