9

ユーザーに何かを出力する必要があるときに、Unicodeですべてを実行し、UTF-8としてエンコードしていることを知って、Pythonの世界で満足していました。次に、同僚の1人が「UTF-8Everywhere」マニフェスト(2012)を送ってくれて、混乱しました。

  • この記事の著者は、Pythonが使用するUnicode表現であるUCS-2がUTF-16と同義であると何度も主張しています。
    • 彼は、Pythonが内部文字列表現にUTF-16を使用していると直接言っているところまで行っています。
  • 著者はまた、Windowsの愛好家であり開発者であることを認め、MSが長年にわたって文字エンコードを処理してきた方法により、そのグループが最も混乱しているため、おそらく彼自身の混乱であると述べています。知らない...

誰かがPythonでのUTF-16とUnicodeの状態を説明できますか?それらは同義であり、そうでない場合は、どのようにですか?

4

1 に答える 1

22

PythonでのUnicode文字列の内部表現(2.2から3.2までのバージョン)は、Pythonがワイドモードとナローモードのどちらでコンパイルされたかによって異なります。ほとんどのPythonビルドはナローです(sys.maxunicodeナロービルドでは65535、ワイドビルドでは1114111で確認できます)。

ワイドビルドでは、文字列は内部的に4バイト幅の文字のシーケンスです。つまり、UTF-32エンコーディングを使用します。すべてのコードポイントは、正確に1つのワイド文字の長さです。

ナロービルドでは、文字列はUTF-16を使用して、内部的に2バイト幅の文字のシーケンスになります。BMPを超える文字(コードポイントU + 10000以上)は、通常のUTF-16サロゲートペアを使用して格納されます。

>>> q = u'\U00010000'
>>> len(q)
2
>>> q[0]
u'\ud800'
>>> q[1]
u'\udc00'
>>> q
u'\U00010000'

UTF-16とUCS-2は同じではないことに注意してください。UCS-2は固定幅のエンコーディングです。すべてのコードポイントは2バイトとしてエンコードされます。したがって、UCS-2はBMPを超えるコードポイントをエンコードできません。UTF-16は可変幅エンコーディングです。BMPの外側のコードポイントは、サロゲートペアと呼ばれる文字のペアを使用してエンコードされます。


これはすべて、PEP393の実装に伴う3.3での変更であることに注意してください。現在、Unicode文字列は、最大のコードポイントを保持するのに十分な幅の文字を使用して表されます。ASCII文字列の場合は8ビット、BMP文字列の場合は16ビット、それ以外の場合は32ビットです。これにより、ワイド/ナローディバイドがなくなり、ASCIIのみの文字列が多数使用されている場合のメモリ使用量を削減できます。

于 2012-10-26T23:03:33.250 に答える