Unicode和Python中的`decode()`函数

8
>>> a = "我"  # chinese  
>>> b = unicode(a,"gb2312")  
>>> a.__class__   
<type 'str'>   
>>> b.__class__   
<type 'unicode'>  # b is unicode
>>> a
'\xce\xd2'
>>> b
u'\u6211' 

>>> c = u"我"
>>> c.__class__
<type 'unicode'>  # c is unicode
>>> c
u'\xce\xd2'

bc都是unicode,但是>>> b输出的是u'\u6211',而>>> c输出的是u'\xce\xd2',为什么呢?


你使用的终端是什么?我无法在我的Unicode gnome终端上重现结果(c === u'\u6211')。 - Chris Morgan
@ChrisMorgan 我在IDLE中测试了这些代码。 - Tanky Woo
可以使用IDLE重现此问题。 - Roman Bodnarchuk
2个回答

12
当你输入"我"时,Python解释器从终端获取该字符在本地字符集中的表示形式,并将其存储在字符串中,由于使用了""。在我的UTF-8系统上,这是'\xe6\x88\x91'。在你的GB2312系统上,它是'\xce\xd2',这解释了你变量a的值。
当你输入u"我"时,Python解释器不知道字符所在的编码方式。它所做的事情与普通字符串基本相同:将字符的字节存储在Unicode字符串中,并将每个字节解释为Unicode代码点,因此得出了错误的结果u'\xce\xd2'(或者,在我的系统上,u'\xe6\x88\x91')。
这个问题只存在于交互式解释器中。当你编写Python脚本或模块时,你可以在开头指定编码方式,这样Unicode字符串就会正确输出。例如,在我的系统上,以下代码将打印两次单词“liberté”:
#!/usr/bin/env python
# -*- coding: utf-8 -*-

print(u"liberté")
print("liberté")

0

交互式Python展示了一个对象的表示,当你只输入它的名称时。另一方面,print命令试图呈现字符。你的变量名为a,是字符串类型。实际上,Python 2.x中的字符串是一系列字节。因此,它取决于您的工作环境。您告诉unicode()函数,您现在使用gb2312编码。如果是这样,那么b包含给定编码中字符的正确表示。

尝试一下

>>> print b

在你的情况下,很可能会看到想要的结果。也可以尝试:

>>> print repr(a)
...
>>> print repr(b)

如果可能的话,该表示是一个文本字符串,当复制粘贴到源代码中时,将创建具有相同值的对象。

请查看Mark Pilgrim的“Dive Into Python 3”,第4章。字符串(http://getpython3.com/diveintopython3/strings.html),以获得清晰易懂的解释。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接