unichr(0x10000)ValueErrorなしで cpython をコンパイルすると、 a で失敗します--enable-unicode=ucs4。
unicodeプログラムが実行されているPythonインタープリターの種類に関係なく、任意のUnicodeスカラー値またはコードポイントを文字列に変換する言語組み込み関数またはコアライブラリ関数はありますか?
unichr(0x10000)ValueErrorなしで cpython をコンパイルすると、 a で失敗します--enable-unicode=ucs4。
unicodeプログラムが実行されているPythonインタープリターの種類に関係なく、任意のUnicodeスカラー値またはコードポイントを文字列に変換する言語組み込み関数またはコアライブラリ関数はありますか?
はい、どうぞ:
>>> unichr(0xd800)+unichr(0xdc00)
u'\U00010000'
理解すべき重要な点unichr()は、Python インタープリターの文字列エンコーディングで整数を単一のコード単位に変換することです。The Python Standard Library documentation for 2.7.3, 2. Built-in Functions , onunichr() read,
Unicode コードが整数 i... である1 文字の Unicode 文字列を返します。引数の有効な範囲は、Python の構成方法によって異なります。UCS2 [0..0xFFFF] または UCS4 [0..0x10FFFF] のいずれかです。
ValueErrorそれ以外の場合は上げられます。
Unicode 用語で「1 つのコード単位」を意味する「1 文字」に強調を加えました。
Python 2.x を使用していると仮定しています。Python 3.x インタープリターには組み込みunichr()関数がありません。代わりに、3.3.0 の Python 標準ライブラリ ドキュメント、2. 組み込み関数、chr()読み取り時、
Unicode コードポイントが整数 i... である文字を表す文字列を返します。引数の有効な範囲は 0 から 1,114,111 (基数 16 で 0x10FFFF) です。
戻り値は、コード単位が 1 つの文字列ではなく、長さが指定されていない文字列になることに注意してください。したがって、Python 3.x では、chr(0x10000)期待どおりに動作します。「任意の Unicode スカラー値またはコードポイントをunicode、プログラムが実行されている Python インタープリターの種類に関係なく機能する文字列に変換します」。
しかし、Python 2.x に戻ります。を使用unichr()して Python 2.xunicodeオブジェクトを作成し、0xFFFF を超える Unicode スカラー値を使用している場合は、Python インタープリターのunicodeオブジェクトの実装を認識するようにコードをコミットしていることになります。
unichr()スカラー値を試行し、 をキャッチValueErrorし、対応する UTF-16 サロゲート ペアで再試行する関数を使用して、この認識を分離できます。
def unichr_supplemental(scalar):
try:
return unichr(scalar)
except ValueError:
return unichr( 0xd800 + ((scalar-0x10000)//0x400) ) \
+unichr( 0xdc00 + ((scalar-0x10000)% 0x400) )
>>> unichr_supplemental(0x41),len(unichr_supplemental(0x41))
(u'A', 1)
>>> unichr_supplemental(0x10000), len(unichr_supplemental(0x10000))
(u'\U00010000', 2)
ただし、スカラーを UTF-32 byte の 4 バイト UTF-32 値に変換し、このバイトを文字列にstringデコードする方が簡単な場合があります。stringunicode
>>> '\x00\x00\x00\x41'.decode('utf-32be'), \
... len('\x00\x00\x00\x41'.decode('utf-32be'))
(u'A', 1)
>>> '\x00\x01\x00\x00'.decode('utf-32be'), \
... len('\x00\x01\x00\x00'.decode('utf-32be'))
(u'\U00010000', 2)
上記のコードは、Unicode 文字列の UTF-16 エンコーディングを使用して Python 2.6.7 でテストされました。Unicode 文字列の UTF-32 エンコーディングを使用する Python 2.x インタープリターではテストしませんでした。ただし、Unicode 文字列の実装を備えた Python 2.x インタープリターでは変更せずに動作するはずです。