2010年01月19日

Java6にはUnicode正規化の機能がいるそうな

恥ずかしながら、先月くらいに気付いたのですが、Java1.6からはSDKにUnicode正規化に関する機能が標準搭載されているようで。便利になったものですな。

java.text.Normalizerで、normalizeと書くだけで実行出来ます。

以下、サンプル。変な文字使ってるので機種によって化けるかもしれません。ご了承ください。


import java.text.Normalizer;

public class Test {

public static void main(String[] args) throws Exception {

/****** 平仮名の「が」 ******/
// 正規分解とそれに続く正規合成
Normalizer.normalize( "が", Normalizer.Form.NFC );
// => が
// 正規分解
Normalizer.normalize( "が", Normalizer.Form.NFD );
// => か” (化けたので濁点は似たものに置き換え)
// 互換部品とそれに続く正規合成
Normalizer.normalize( "が", Normalizer.Form.NFKC );
// => が
// 互換分解
Normalizer.normalize( "が", Normalizer.Form.NFKD );
// => か” (化けたので濁点は似たものに置き換え)

/****** いろいろ実行してみる ******/
// 正規分解とそれに続く正規合成
Normalizer.normalize( "WGI壱ア〜−", Normalizer.Form.NFC );
// => WGI壱ア〜−
// 正規分解
Normalizer.normalize( "WGI壱ア〜−", Normalizer.Form.NFD );
// => WGI壱ア〜−
// 互換部品とそれに続く正規合成
Normalizer.normalize( "WGI壱ア〜−", Normalizer.Form.NFKC );
// => IVviii10壱ア~-
// 互換分解
Normalizer.normalize( "WGI壱ア〜−", Normalizer.Form.NFKD );
// => IVviii10壱ア~-
}
}


互換分解を使うと半角カナが全角になったり、ローマ数字がバラされたりします。使い道はいつも悩むけど、自分はなんとなくNFKCかけてることが多い気がする。