4

Javaでテキストを正規化/アクセント設定しないようにするにはどうすればよいですか?私は現在java.text.Normalizerを使用しています:

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

しかし、それは完璧にはほど遠いです。たとえば、ノルウェー語の文字æとøはそのままにします。誰かが代替案を知っていますか?あらゆる種類の言語の文字をaz範囲だけに変換するものを探しています。これを行うにはさまざまな方法があることを認識しており(たとえば、æは「a」、「e」、さらには「ae」としてエンコードする必要がありますか?)、私はあらゆる解決策を受け入れています。すべての言語でこれがうまくできるとは思えないので、自分で何かを書くのは好きではありません。パフォーマンスは重要ではありません。

ユースケース:ユーザーが入力した名前をプレーンなaz範囲の名前に変換したい。変換された名前はユーザーに表示されるので、ユーザーが元の言語で書いたものとできるだけ一致させたいと思います。

編集:

了解しました。投稿を無視し、私の質問に答えてくれなかったことに感謝します。:)多分私はユースケースを省くべきでした。しかし、はっきりさせておきます。内部に保存するために名前を変換する必要があります。ここで許可されている文字の選択を制御することはできません。名前は、たとえばURLでユーザーに表示されます。このフォーラムのユーザー名が正規化され、名前をクリックするとURLに表示されるのと同じ方法です。このフォーラムは、「Bășan」のような名前を「baan」に変換し、「Øyvind」のような名前を「yvind」に変換します。私はそれがより良くできると信じています。私はアイデアを探しており、できればこれを行うためのライブラリ関数を探しています。正しく理解できないこと、「o」と「ø」が違うことなどは知っていますが、私の名前が「Øyvind」でオンラインフォーラムに登録する場合は、ユーザー名を「 「oyvind」ではなく「oyvind」。これが理にかなっていることを願っています!ありがとう!

(いいえ、ユーザーが自分のユーザー名を選択することは許可されません。私は本当にjava.text.Normalizerに代わるものを探しています。ありがとう!)

4

1 に答える 1

2

あなたがしていることのすべての意味を考慮していると仮定すると、それがうまくいかない可能性のあるすべての方法、中国語の絵文字やラテンアルファベットに相当するものがない他のものを手に入れたらどうするでしょう...

私が知っているライブラリはありません。それはあなたが望むことをします。同等性のリストがある場合(あなたが言うように、「æ」から「ae」など)、それらをファイルに保存できます(または、これを頻繁に行う場合は、メモリ内の並べ替えられた配列に保存できます。パフォーマンス上の理由から)次に、ルックアップを実行して文字に置き換えます。(Unicode文字の数)をchar配列として格納するためのスペースがメモリにある場合は、各文字のUnicode値を実行して、ストレートルックアップを実行できることが最も効率的です。

つまり、/ u1234 => lookupArray [1234] =>'q'

または何でも。

したがって、次のようなループが作成されます。

StringBuffer buf = new StringBuffer();
for (int i = 0; i < string.length(); i++) {
  buf.append(lookupArray[Character.unicodeValue(string.charAt(i))]);
}

私はそれを最初から書いたので、おそらくいくつかの悪いメソッド呼び出しか何かがあります。

おそらく先読みバッファを使用して、分解された文字を処理するために何かを行う必要があります。

幸運-これには落とし穴がたくさんあると確信しています。

于 2011-11-08T02:46:00.813 に答える