Pythonでサロゲートペアの範囲の数値実体参照を文字に戻す
𠮟 (𠮟)が数値実体参照で表現されているのをPythonのUnicode文字に戻すのにどうするの?という質問について。普通にunichr(134047)したら以下のような例外が飛ぶ。
ValueError: unichr() arg not in range(0x10000) (narrow Python build)
(narrow Python build)と書かれているように、これってコンパイル時のオプションに依存する挙動で、下記のオプションを付けてビルドしなおせば解決する。もしくはPython3を使うか。
./configure --enable-unicode=ucs4
とはいえ、ビルドしなおすのも3にするのも嫌だったりするわけなので解決方法を調べてみた。
>>> code = 134047 >>> "%08x" % code '00020b9f' >>> ("\U" + "%08x" % code).decode("unicode-escape") u'\U00020b9f' >>> print _ 叱
できたできた。ちなみにコードの最後の叱が𠮟ではないのは、はてなダイアリーが𠮟を勝手に実体参照に置き換えてしまって正しい表示ができないので、なるべく見た目が近いように書き換えた為です。
ref. ValueError: unichr() arg not in range(0x10000) (narrow Python build), please help - Stack Overflow
see also: PEP 261 -- Support for "wide" Unicode characters