8

Python 2.2 およびPEP 261以降、Python は「ナロー」モードまたは「ワイド」モードでビルドできます。これは、「文字」、つまり「Python Unicode 文字列のアドレス指定可能な単位」の定義に影響します。

ナロー ビルドの文字は、UTF-16 コード単位のように見えます。

>>> a = u'\N{MAHJONG TILE GREEN DRAGON}'
>>> a
u'\U0001f005'
>>> len(a)
2
>>> a[0], a[1]
(u'\ud83c', u'\udc05')
>>> [hex(ord(c)) for c in a.encode('utf-16be')]
['0xd8', '0x3c', '0xdc', '0x5']

(上記は、ナロー ビルドでは UTF-16 ではなく UCS-2 を使用すると主張する一部の 情報源に同意しないようです。非常に興味深い)

Python 3.0 はこの区別を維持していますか? それとも、すべての Python 3 ビルドがワイドですか?

(3.3 で文字列の内部表現を変更するPEP 393について聞いたことがありますが、これは 3.0 ~ 3.2 とは関係ありません。)

4

1 に答える 1

9

はい、3.0 から 3.2 までです。Windows はナロー ビルドを使用しますが、(ほとんどの) Unix はワイド ビルドを使用します

Windows で Python 3.2 を使用する場合:

>>> a = '\N{MAHJONG TILE GREEN DRAGON}'
>>> len(a)
2
>>> a
''

この動作は、Windows を使用する 3.3 以降で想定されますが、次のようになります。

>>> a = '\N{MAHJONG TILE GREEN DRAGON}'
>>> len(a)
1
>>> a
'\U0001f005'
>>> print(a)
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    print(a)
UnicodeEncodeError: 'UCS-2' codec can't encode character '\U0001f005' 
in position 0: Non-BMP character not supported in Tk

UCS-2 コーデックが Tk で使用されます (私は IDLE を使用しています - 端末は別のエラーを表示する場合があります)。

于 2013-02-09T20:02:51.430 に答える