1

可能重复:
将符号、重音字母转换为英文字母

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

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

"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

4 回答 4

4

我从这篇文章中尝试了这个,它似乎有效。

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

编辑:但是替换组合变音符号有一个副作用,您无法区分À Á Â

于 2012-10-20T18:32:55.653 回答
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 的回答不好,因为它只处理一对一的字符替换。

于 2012-10-20T18:15:28.590 回答
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();
}
于 2012-10-20T18:33:56.240 回答
2

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

于 2012-10-20T18:06:40.323 回答