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

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対1の文字置換しか処理しないため、適切ではありません。

于 2012-10-20T18:15:28.590 に答える
4

私はこの投稿からこれを試しましたが、うまくいくようです。

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

編集:しかし、合成発音区別符号を置き換えると、 ÀÁÂを区別​​できないという副作用があります

于 2012-10-20T18:32:55.653 に答える
3

メインアプローチのコメントを読んだ後、より良いオプションは問題を修正することだと思います-どちらがエンコーディングに関連していますか?-そして症状を隠そうとしないでください。

また、これには手動の明示的なマッピングが必要であり、正規表現のUnicode文字クラスを使用したnandeeshの回答よりも理想的ではない可能性があります。


これは、マッピングを実行するためのコードのスケルトンです。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 に答える