Python 3中的Unicode字符串是否依赖于“窄”/“宽”构建?

时间:2013-02-09 19:34:33

标签: python unicode python-3.x

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

1 个答案:

答案 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 - 终端可能会显示另一个错误)。