首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python 3中的Unicode字符串是否仍然依赖于“窄”/“宽”构建?

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

Stack Overflow用户
提问于 2013-02-09 19:34:32
回答 1查看 1.4K关注 0票数 8

由于Python2.2和佩普261,Python可以在“窄”或“宽”模式下构建,这会影响“字符”的定义,即“Python字符串的可寻址单元”。

窄构建中的字符看起来类似于UTF-16代码单元:

代码语言:javascript
复制
>>> 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']

(以上似乎不同意http://www.cmlenz.net/archives/2008/07/the-truth-about-unicode-in-python https://stackoverflow.com/questions/1838170/what-is-internal-representation-of-string-in-python-3-x的观点,即狭隘的构建使用UCS-2,而不是UTF-16。非常有趣)

Python3.0是否保留了这种区别?还是所有Python3的构建都很宽?

(我听说过佩普393在3.3中改变了字符串的内部表示形式,但这与3.0 ~3.2无关。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-09 20:02:51

是的,从3.0到3.2都有。Windows使用窄生成,而(大多数) Unix使用宽生成。

在Windows上使用Python3.2:

代码语言:javascript
复制
>>> a = '\N{MAHJONG TILE GREEN DRAGON}'
>>> len(a)
2
>>> a
''

虽然在使用3.3+的情况下,这种行为是预期的:

代码语言:javascript
复制
>>> 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上使用(我使用的是空闲,终端可能会显示另一个错误)。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14790708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档