私たちは、主にヨーロッパ人がテキストを入力し(UTF-8で)異なるシステムに配布する必要があるシステムを持っています。そのほとんどはUTF-8を受け入れますが、今では米国のみを受け入れる米国システムにもテキストを配布する必要があります。 -Ascii 7ビット
したがって、すべてのヨーロッパの文字を最も近いUS-Asciiに変換する必要があります。このタスクに役立つJavaライブラリはありますか?
現在、Å(スウェーデン語のAA)-> Aなどで、入力された文字に一致するものが見つからない場合、それをログに記録し、疑問符で置き換える変換テーブルへの追加を開始しましたそして、次のリリースのためにそれを修正してみてください。しかし、それは非常に非効率的であり、誰か他の誰かが以前に類似した何かをしたに違いありません。
これは次のようにして行うことができます( 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}+","");
}
独自のテーブルを作成する代わりに、テキストを正規化形式Dに変換することもできます。この場合、文字は基本文字と発音区別符号として表されます(たとえば、「á」は「a」に置き換えられ、その後に結合された鋭アクセントが続きます)。次に、ASCII文字ではないすべてのものを削除できます。
テーブルはまだ存在していますが、現在はUnicode標準のテーブルです。
さらに多くのケースをキャッチするために、NFDの代わりにNFKDを試すこともできます。
参照:
Joe Liversedgeによる回答 への応答として、参照されているLucene ISOLatin1AccentFilterは存在しません:
org.Apache.lucene.analysis.ASCIIFoldingFilter に置き換えられました。
このクラスは、最初の127 ASCII文字(「Basic Latin」Unicodeブロック)にないアルファベット、数字、および記号のUnicode文字をASCIIに変換します_同等のもの(存在する場合)。次のUnicodeブロックの文字が変換されます。ただし、妥当なASCIIの選択肢を持つ文字のみが変換されます。
ご参考までに -
これは通常、検索アプリケーションで役立ちます。対応するLucene ISOLatin1AccentFilter 実装を参照してください。これは実際にはランダムなローカル実装にプラグインするように設計されていませんが、トリックを行います。
これを行うための組み込み関数がいくつかあります。関連する主なクラスは CharsetEncoder
で、これはnio
パッケージの一部です。より簡単な方法は String.getBytes(Charset)
で、 ByteArrayOutputStream
に送信できます。