Unicode Normalizer

author; matsuza (matsuza gmail.com, http://d.hatena.ne.jp/matsuza)

Unicode規格で規定されているNormalize処理を行います。
UAX #15: Unicode Normalization Forms:
Unicode.orgで提供されているテストケースに準拠しています。
MITとGPLのデュアルライセンスとします。

デモ

↓に何か文字列を入れると、NFD, NFKD, NFC, NFKCの各モードでノーマライズした結果が表示されます。
入れると面白い文字列一覧 ; ㈱㍍ガガ①가ȇ
文字列長や、delキーで文字を削除するときの振る舞いなんか面白いかも知れません。

NFD(length=)
NFKD(length=)
NFC(length=)
NFKC(length=)

利用方法

読み込み方法

unorm.jsとunormdata.jsを、この順に読み込んでください。

名前空間

UNorm名前空間を利用します。以下の説明ではこの名前空間が暗黙的に使われているものとします。

API

normalize(mode, str)

ノーマライズを行います。
引数
備考
ノーマライズはそれなりに重い処理なので、大きな文字列を処理する場合は後述するイテレータインタフェースを用いて適度にsetTimeout()することを推奨します。
サンプル
var s = "㈱㍍";
document.write(UNorm.normalize("NFKC", s));

nfd(str)

nfkd(str)

nfc(str)

nfkc(str)

関数名に示される種類のノーマライズを行います。 nfd(str)はnormalize("NFD", str)と厳密に等価です。
引数
サンプル
var s = "㈱㍍";
document.write(UNorm.nfkc(s));

createIterator(mode, str)

ノーマライザのイテレータインタフェースを返します。
引数
備考
返値はイテレータオブジェクトです。
ノーマライズ処理を行う際、簡便なのはnormalize関数を使って処理することですが、巨大な文字列を処理する場合はイテレータインタフェースを使うことも考慮してください。
イテレータオブジェクトはnext()メソッドを備えており、next()を呼ぶたびにUCharオブジェクトを返します。返すべきデータが無くなった以降は、next()を呼ぶたびにnullが帰ります。
UCharオブジェクトはtoString()を備えており、これを用いて文字列に変換できます。
サンプル
var it = createIterator("NFC", "①ガギグゲゴ");
var ret = "";
var uchar;
while(!!(uchar = it.next())){
	ret += uchar.toString();
}
document.write(ret);