Unicode::Normalize で遊ぶ

Unicode の規格では,文字の合字(リガチャ等)等を統一的に扱えるように,「正規化」という処理が仕様として定まっています。この正規化処理のうち「互換性分解」という処理を行うと副作用として半角カナを全角カナに変換できます(逆に全角カナ→半角カナはできません)。

#!/usr/bin/perl

use strict;
use utf8;
use Encode;
use Unicode::Normalize;

my $src = 'ポンジュース';
my $dst = Unicode::Normalize::NFKC($src);

print Encode::encode('utf8', "${src} => ${dst}\n");
# OUTPUT is: ポンジュース => ポンジュース

Unicode の正規化についてはperl5.8のUnicodeサポート および http://homepage1.nifty.com/nomenclator/unicode/normalization.htm が詳しいです。特に後者に


UAX #15によれば、NFKDおよびNFKCは、互換分解によって多くの書式上の差異をなくしてしまうため、任意のテキストに対して無闇に用いてはいけない (Normalization forms KC and KD must not be blindly applied to arbitrary text.) が、大文字・小文字を揃える処理のように考えるのが良く、例えば、特定の文脈においてテキストの核心の意味を特定したり、必ずしも適切ではないテキストを修正したりするのに有用とされています。
と書いてあります通り,本来はたとえばデータベース等で同じようなフィールド値(ⅢとIIIとか)を検索したい場合に用いるものですので,むやみやたらと用いるべきではないそうです。ウェブアプリでのフォーム入力は適用範囲としてまぁまぁ当てはまる気もしますが。

続きを読む