从Python 2.2和PEP 261开始,Python可以以“窄”或“宽”模式构建,这会影响“字符”的定义,即“Python Unicode字符串的可寻址单元”。 / p>
窄版本中的字符看起来像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']
(以上似乎不同意some sources坚持认为窄版本使用UCS-2,而不是UTF-16。确实非常有趣)
Python 3.0是否保持这种区别?或者所有Python 3都构建得很广泛?
(我听说过PEP 393改变了3.3中字符串的内部表示,但这与3.0~3.2无关。)
答案 0 :(得分: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 - 终端可能会显示另一个错误)。