基本多言語面(BMP: Basic Multilingual Plane)外の文字(U+10000~)の検索に関して,Boost.Regex と Onigmo それぞれおかしな点を発見しました。
◎Boost.Regex
基本多言語面外の文字が 1 文字と扱われません。
再現手順:
[1] 「𩸽がうまい」と打つ。𩸽(ほっけ)は U+29E3D で基本多言語面外。
[2] 検索パターンを (.) とする
[3] 置換文字列を <\1> とする
[4] 全置換
正しくは <𩸽><が><う><ま><い> となるはずだが,<�><�><が><う><ま><い> となる。
Onigmo は正しく置換します。
◎Onigmo
検索で基本多言語面外の文字が見出されたあとの「次を検索」の動作がおかしい。
再現手順
[1] 「𩸽がうまい」と打つ。
[2] 検索パターンを . とする
[3] 検索する
→この時点で,正しく「𩸽」が選択状態になります。この状態で何か文字を打つと,正しく「𩸽」がその文字に替わります。ここまでは正常。
[4] この状態で Shift+F3 などにより「次を検索」する
すると,「𩸽」の文字のところが,あたかも二つのスペースのように表示され,その二つめのほうが選択状態になります。(「𩸽」という文字は見えなくなります)。
low surrogate が選択状態になったような感じですね。
この状態で例えば「a」と打つと,「𩸽」だったところが U+D867+a になります。