web-dev-qa-db-ja.com

JavaでUTF-8をUS-Asciiに変換する方法

私たちは、主にヨーロッパ人がテキストを入力し(UTF-8で)異なるシステムに配布する必要があるシステムを持っています。そのほとんどはUTF-8を受け入れますが、今では米国のみを受け入れる米国システムにもテキストを配布する必要があります。 -Ascii 7ビット

したがって、すべてのヨーロッパの文字を最も近いUS-Asciiに変換する必要があります。このタスクに役立つJavaライブラリはありますか?

現在、Å(スウェーデン語のAA)-> Aなどで、入力された文字に一致するものが見つからない場合、それをログに記録し、疑問符で置き換える変換テーブルへの追加を開始しましたそして、次のリリースのためにそれを修正してみてください。しかし、それは非常に非効率的であり、誰か他の誰かが以前に類似した何かをしたに違いありません。

26
Ulf Lindback

ni2ascii プログラムはCで記述されていますが、おそらくJavaに簡単に変換できます。これには、近似の大規模なテーブルが含まれています(暗黙的に、スイッチに-ケースステートメント)。

広く受け入れられている近似はないことに注意してください。ドイツ人はÄをAEに置き換えてほしいと考えています。フィンランド人とスウェーデン人はAだけを好んでいます。 Å の例も明白ではありません。 Aを使用しますが、デンマーク人とノルウェー人は、歴史的に正しいAAをより好むかもしれません。

19

これは次のようにして行うことができます( this Core Java Technology Tech Tip のNFDの例から):

public static String decompose(String s) {
    return Java.text.Normalizer.normalize(s, Java.text.Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+","");
}
36
Simon Lieschke

独自のテーブルを作成する代わりに、テキストを正規化形式Dに変換することもできます。この場合、文字は基本文字と発音区別符号として表されます(たとえば、「á」は「a」に置き換えられ、その後に結合された鋭アクセントが続きます)。次に、ASCII文字ではないすべてのものを削除できます。

テーブルはまだ存在していますが、現在はUnicode標準のテーブルです。

さらに多くのケースをキャッチするために、NFDの代わりにNFKDを試すこともできます。

参照:

6
CesarB

Joe Liversedgeによる回答 への応答として、参照されているLucene ISOLatin1AccentFilterは存在しません

org.Apache.lucene.analysis.ASCIIFoldingFilter に置き換えられました。

このクラスは、最初の127 ASCII文字(「Basic Latin」Unicodeブロック)にないアルファベット、数字、および記号のUnicode文字をASCIIに変換します_同等のもの(存在する場合)。次のUnicodeブロックの文字が変換されます。ただし、妥当なASCIIの選択肢を持つ文字のみが変換されます。

ご参考までに -

5
Matt Storer

これは通常、検索アプリケーションで役立ちます。対応するLucene ISOLatin1AccentFilter 実装を参照してください。これは実際にはランダムなローカル実装にプラグインするように設計されていませんが、トリックを行います。

2
Joe Liversedge

これを行うための組み込み関数がいくつかあります。関連する主なクラスは CharsetEncoder で、これはnioパッケージの一部です。より簡単な方法は String.getBytes(Charset) で、 ByteArrayOutputStream に送信できます。

0
sblundy