モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

Javaで半角カナ→全角カナ変換する場合のベストプラクティスについて

Javaで半角カナ混じりの文字列を全角カナに変換する方法を調べると、Java6以降だと下記のようにNormalizer.normalizeを利用するという方法が使われることが多いと思います。

Normalizer.normalize("これはテストデス", Normalizer.Form.NFKC);

結果:

これはテストデス


こうやって実装していたのですが、全角波線「〜」が半角チルダになってしまうという問題が出ました。

調べてみると、このnormalizeを半角カナ→全角カナ変換に使うと、意図していない全角波線(波ダッシュ)や全角ハイフンが半角に変換されてしまうということがわかりました。

Normalizer.normalize("コレハーテストデス〜", Normalizer.Form.NFKC);

結果:

コレハ-テストデス~


実は半角カナだけでなく、下記ページの「NFKC」と書いてあるものに全て変換されてしまうのです。


Unicode正規化
http://homepage1.nifty.com/nomenclator/unicode/normalization.htm


「NFKC」は、単に半角カナ→全角カナ変換をするものというわけではなく、Unicodeの「Composition」と「Compatibility」の変換をするものなので、こうなるわけですね。

他にも「$」だとか「藭」(U+FA19)だとか、望んでないものまで変換されてしまうことがわかります。


そしてNormalizerのマニュアル見ると、半角カナだけを変換するような、他の変換種のパラメータは存在しません。


Normalizer (Java Platform SE 6)
http://docs.oracle.com/javase/jp/6/api/java/text/Normalizer.html


なので、Javaで半角カナ→全角カナ変換「だけ」を行いう方法を探してみました。
こういう文字種変換でよく使われるICU4Jというライブラリがあるのですが、半角カナだけを対象とした変換は無いようでした。


ICU - International Components for Unicode
http://site.icu-project.org/


ということで結局、こちらのページを参考にさせていただいて、半角全角のマッピングテーブルから変換する関数を作るという、どんだけの人が車輪を再発明したんだろう…みたいな解決法となりました。


文字列処理
http://pgcafe.moo.jp/JAVA/string/main_1.htm


こういう場合の、他にもっと良い方法あれば教えてください。


(関連)

UploadPackでMacから濁点などのついたファイルをFirefoxからアップロードされると文字化けする - モーグルとカバとパウダーの日記
http://d.hatena.ne.jp/stealthinu/20140702/p1