まずサロゲートペアの性質について
・Unicode と UTF
http://www.parof.jp/Programing/Unicode/
Unicode で「D800〜DFFF」の範囲(これがサロゲート領域)にあるビット列がでてきたら、次の2バイトと合わせて1文字と認識しなさい、と定められています(逆に言うと、「D800〜DFFF」はそれだけで表現される文字というのが定められていません)。そしてこの領域のうち「D800〜DBFF」は4バイトのうち上位2バイトで使い、「DC00〜DFFF」は下位2バイトで使われます。
JavaScriptのcharCodeAtメソッドでサロゲートペアの文字
一文字を調べると、charCodeAt(0)で上位サロゲートのコード、
charCodeAt(1)で下位サロゲートのコードが返ってきます。
(ちなみにlengthは2です)
ここまで分かっていれば普通はコードをすらすら
書けるのでしょうけど、どうも最近コーディングしてないせいか
サボリ癖が。
そこで、それらしいサンプルをネットで探したのですが
なかなか見つかりませんでした。
ふとGoogle Code Search思い出して
「surrogate charCodeAt」で検索したら、それらしいのを発見。
blogs/rsc/js/md5.js - Google Code Search
「/* Decode utf-16 surrogate pairs */」というコメントの付近。
x = input.charCodeAt(i);
y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0;
if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF)
{
〜略〜
}
これを参考にして、サロゲートペアの有無をチェックするものを
作ってみました。
こちら
自分用に作ったものなので、参考程度にとどめておいてください。
個別に取得した上位サロゲートと下位サロゲートのコード
再度組み合わせて一文字として表示させるには
String.fromCharCode(上位サロゲート,下位サロゲート);
とやるようなのですが、これがわかるのに苦労しました。