たまりば

パソコン・インターネット パソコン・インターネット三鷹市 三鷹市

Windows2000でサロゲートペア
2009年07月19日 18:11

現在のUnicodeは、256×256文字を一つの「面」として17の面に文字を定義する。すなわち65536×17の文字が使える(実際には未定義領域などもありこれより少ない)。
そして、そのうち最初の面(BMP; Basic Multilingual Plane)はUnicode制定当初から使えた領域で、基本の1文字2バイトで扱う。
それ以外の16個の面(非BMP)は当初のUnicodeには規定されていなかったもので、サロゲートペアという1文字4バイトの複雑な扱いになっている。

ここまで前置き。

さてそんなサロゲートペアだが、WindowsではXPになって初めて使えるようになった。
これに対応していないWindows2000では、例えば「」や「」などの文字は正常に表示されず、2文字分の黒点として表示されてしまう。

…と思っていたのだが、MicroSoftの資料を見ると2000でもサロゲートペアが使えるという。どうも2000にも機能自体は存在して、標準では無効化されているということのようだ。
これを有効化するにはレジストリを書きかえるだけでいい。
以下が書き換える場所である。メモ帳にコピペして.regの拡張子で保存してダブルクリックすれば書き換わる。
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\LanguagePack]
"SURROGATE"=dword:00000002
これを書き換えるとどうなるか。
試しに以下の文字列をメモ帳に書き込んでみる。これらは全て非BMPの文字である。



まずサロゲート機能がオフの状態。
サロゲートオフ
このように1文字につき2つの黒点が表示される。1文字=2バイトと判断しているために4バイトは2文字と認識されてしまうのだろう。
サロゲート機能をオンにするとこのとおり正常に表示される。
サロゲートオン

なお、このレジストリキーはXPにもあるので、これを値ごと削除すればXPでサロゲートペアが扱えなくなるはずである。暇があったら試してみたい。