【问题标题】:Efficently Replacement of all unsupported chars in a String [duplicate]有效替换字符串中所有不受支持的字符[重复]
【发布时间】:2012-10-11 01:39:24
【问题描述】:

可能重复:
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'");

等等

【问题讨论】:

  • 如果解决“重新加载带有重音字符的嵌套字符串的问题”超出了您的能力或时间限制,那么避免此字符集/编码问题的更简单方法可能是存储经过 base64 编码的字符串。你可以使用commons.apache.org/codec/apidocs/org/apache/commons/codec/…
  • 似乎有一个 api Normalize.normalize 来做这样的事情。检查这个post
  • @nandeesh:我认为 OP 正试图保留重音字符。
  • @BheshGurung Normalize api 确实根据我的理解转换为英文字母,但我从未尝试过
  • @rambocoder 基本上我需要使用这个解决方法,因为我还没有找到一个有效的解决方案来解决这个stackoverflow.com/questions/12990041/…

标签: java android string replace


【解决方案1】:

我从post 尝试了这个,它似乎有效。

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

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

【讨论】:

  • 但是将重音字符 à 替换为 a' 或简单地将重音字符 à 变成 ??
  • 第一个答案用a替换了à,我误解了问题,但我编辑了它,我改变了replaceall行。检查一下
  • +1 我喜欢这种方法。正则表达式引擎在这种操作中通常也非常有效(没有回溯 hullaballoo)。
  • 但是如果我用中文输入会发生什么?
  • 我认为它没有任何转变。规范化只改变重音字母
【解决方案2】:

如果您不介意添加 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 的回答不好,因为它只处理一对一的字符替换。

【讨论】:

  • 噢!你是对的。谢谢。将更新我的答案。
【解决方案3】:

在阅读了主要方法中的 cmets 之后,我认为更好的选择是解决问题 - 与编码相关? - 不要试图掩盖症状。

此外,这仍然需要手动显式映射,这可能使其不如 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();
}

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2010-09-22
      • 2020-05-09
      • 2012-11-14
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多