Python2.x使用过程中,中文乱码解决最耳熟能详的方法就是在代码前加上#-*- coding:utf-8 –*-
那么为什么需要这么做呢?什么又是字节和字符?下面我们了解下。
我来讲一下字符问题我的理解吧,虽然我对Python的编码处理的具体细节还不太清楚,不过临时稍微看了一下,和Perl的原理也差不多
最重要的是必须区分“字符”和“字节”的不同,“字符”是抽象的,而“字节”是具体的
比如一个“中”字,在不同编码中用如下字节表示:
GBK Big5 UTF-8 UTF-16LE
/xD6/xD0 /xA4/xA4 /xE4/xB8/xAD /x2D/x4E
所谓“抽象”的“字符”的“中”,并不是指“/xD6/xD0”或“/xA4/xA4”或任何字节,应该把它理解成:GBK编码中“/xD6/xD0”字节所指代的那个字符(语言学中的能指→所指),或者UTF-8编码中“/xE4/xB8/xAD”所指代的那个字符,但并不是这些具体字节本身
问题是,抽象的字符要作为数据进行存储和传递,就必须有具体的形式,也就是说你在程序内部实现中,要存储“中”这个字符,你必须采用某些特定的字节。你可以用“/xD6/xD0”,也可以用“/xE4/xB8/xAD”,也可以用“/x2D/x4E”,Python在Windows下采用的是UTF-16LE(?),也就意味着它的“字符”的载体编码是UTF-16LE
sys.setdefaultencoding(name) Set the current default string encoding used by the Unicode implementation.
文档上是这么写的,如果我的理解没错的话,这个函数的作用就是改变“字符”的载体编码,sys.setdefaultencoding('gbk')以后,“中”这个字符在程序内部就不是用“/x2D/x4E”来承载,而是用“/xD6/xD0”来承载了
Python2.x里的str和unicode有什么区别呢?从字面意义上看容易混淆,实际上,你可以把它理解成str是“字节串”,unicode是“字符串”(string总是翻译成“字符串”,在这里就很容易把人绕晕),看下面的例子:
# -*- coding: gb2312 -*- s = "张三李四" print len(s) #=> 8 u = s.decode('gbk') print len(u) #=> 4
我的脚本编码用的是GBK,而不是UTF-8,你会看到len(s)是8,这是这四个汉字所用的实际8个“字节”,而len(u)是4,这就表示这里有4个“字符”
encode和decode是什么意思呢?所谓编码,就是把意义转换成符号;而解码,就是把符号还原成意义。在这里,encode应该理解成把抽象的字符转换成具体的字节,而decode是把具体的字节还原成抽象的字符
现在的问题是:str类和unicode类都同时具有encode和decode方法,这是一个让我很不以为然的设定。如果按照字节与字符的区分,encode方法是应该只归unicode类所有,decode方法是只归str类所有的,因为“意义”只能转换成“符号”,“意义”再还原成“意义”这本身就没有意义。
新闻热点
疑难解答