Unicode和Python中的`decode()`

Tan*_*Woo 8 python unicode decode codec

>>> 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'
Run Code Online (Sandbox Code Playgroud)

b并且c都是unicode,但>>> b输出u'\u6211'和>>> c输出u'\xce\xd2',为什么?

Fre*_*Foo 12

当你输入时"?",Python解释器从终端获取本地字符集中该字符的表示,由于它的原因,它以字节为单位存储在字符串中"".在我的UTF-8系统上,就是这样'\xe6\x88\x91'.在你的,这是'\xce\xd2'因为你使用GB2312.这解释了变量的价值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é")
Run Code Online (Sandbox Code Playgroud)