Javaで以下のような変換を行いたかったので、Java6からのUnicode正規化(java.text.Normalizer)を試してみたので参考URLなどのメモです。
- 全角英数記号を半角英数記号に。
- 一文字にまとまった「(株)」とか「平成」「昭和」などの年号、「ミリ」や「キロ」などを、ばらばらの全角文字に。
- Windows/Macそれぞれで入力された濁音・半濁音のかな/カナを、揃えたい。
Unicode正規化の参考URL
- Unicode正規化
- Normalizing Text (The Java™ Tutorials > Internationalization > Working with Text)
- Normalizer.Form (Java Platform SE 8 )
- Java SE 6 じゃじゃ馬ならし Unicode の正規化
- Java技術最前線 - 「Java SE 6完全攻略」第56回 文字列の正規化:ITpro
- Java6にはUnicode正規化の機能がいるそうな : mwSoft blog
- Unicodeにあるハイフン/マイナス/長音符/波線/チルダのコレクション | hydroculのメモ
- PHPのmb_convert_kanaとUnicodeのNFKC正規化 | hydroculのメモ
Javaでのサンプルコード
今回の用途で最適だったのはNFKC
今回の用途で最適だったのはNFKC(互換分解とそれに続く正規合成, Normalizer.Form.NFKC)でした。
サンプルコードからの以下の結果がポイントでした。
- 1文字の全角文字「が」「ぱ」「っ」などは変わらない。
- 「か」+濁音などの組み合わせもそのまま変わらない。
- 半角カナ + 濁音などの組み合わせは、相当する1文字の全角文字に変換してくれる(「ヴ」など)。
- 全角英数記号を相当する半角英数記号に変換してくれる。
- 可能なかぎり、丸文字や年号・単位・ギリシャ数字などの1文字を、相当する複数の文字に分解してくれる。
扱う文字列が、記号などかなりの率で混在する上に、Windows/Macでそれぞれ入力された濁音・半濁音のかな/カナ文字が混在してくるデータだったので、互換分解した後に正規合成するNFKCが(多分)正規化して「揃える」のには一番適してるのではないでしょうか。