从 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 无关。)