正規化ルールのサンプル

サンプルプログラム


String inputStr="№,㈱,㍻";
String outpuStr = Normalizer.normalize(inputStr,Normalizer.NFKC);


System.out.println("入力文字列:"+inputStr);
System.out.println("文字列長:"+inputStr.length());
System.out.println("-----");
System.out.println("出力文字列:"+outpuStr);
System.out.println("文字列長:"+outpuStr.length());


実行結果

入力文字列:№,㈱,㍻
文字列長:5

        • -

出力文字列:No,(株),平成
文字列長:9

正規化のモード

Unicode正規化には、以下の4つのモードがある

  • NFC
  • NFD
  • NFKC
  • NFKD

検索エンジンで使用する場合は、"NFKC"を使用することが一般的。

これは、検索漏れを起こさず、できるだけ高速に検索実施させたいためである。

検索速度より向上させるために

Unicodeでは、”ガ”という文字は、以下の2通りで表現可能

  • 平仮名か+濁点(合成可能)という2文字

→NFD,NFKD

  • 濁点付き平仮名かという1文字

NFC,NFKC

できるだけ短くした方が良いため、後者の方がよい

検索漏れをなくす

"№"などのような特殊文字として、1文字で表現できます。
しかし、検索時には"№"という1文字でも、"No"という半角2文字でもヒットしてほしい。

そのため、これを満たす正規化は、NFKDとNKDCである。

ちなみに、有名な特殊文字は他にも㍻、㈱がある。


上記の2つの理由より、検索エンジンで使用される正規化ルールは、NFKCが一般的である。


参考:http://http://homepage1.nifty.com/nomenclator/unicode/normalization.htm

Unicode正規化を実施するためのモジュール

Unicodeの文字列を正規化する場合、便利がモジュールが2つある。

  • Javaで内包されているicu4jのモジュール
  • 公式サイトからダウンロードできる最新版のicu4jのモジュール

ライセンス問題などがない限り、基本的には後者をおすすめ。

その理由は、以下の通り

  1. 最新版のicu4jの方が、より新しいUnicodeに対応
  2. icu4jの正規化のモードをNFKCを使用した場合、Java 1.6までに取り込まれている版では文字列長に対して指数的に性能が劣化する。