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']

(上面似乎不同意一些 坚持窄版本使用 UCS-2,而不是 UTF-16 的消息来源。确实很有趣)

Python 3.0 是否保持这种区别?还是所有 Python 3 构建都广泛?

(我听说PEP 393在 3.3 中改变了字符串的内部表示,但这与 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

Tk 上使用了 UCS-2 编解码器(我正在使用 IDLE - 终端可能会显示另一个错误)。

于 2013-02-09T20:02:51.430 回答