汉字编码问题是困扰工程师们的一大难题,在最近做的spider项目中,遇到了不少相关的麻烦,于是花了一些时间来研究了一下python的字符编码的问题.
1.程序内的编码问题
在没有声明默认编码方式的情况下,python使用ASCII字符来编码,也就是说,默认只支持ASCII从0-127这128个字符,其他非拉丁的字符,如汉字,希伯来语,日语韩语等语言的字符是没有办法显示的,在读取或者在程序的字符串中出现的时候,会出现报错的情况,这个时候,需要指定默认字符集来解决这个问题
可以使用:
#-*- coding: UTF-8 -*-
也可以使用:
# coding: UTF-8
在文件的开头(import)的前面来表明程序所使用的字符集,(utf-8可以换成其他字符集如有需要如GBK,big5,latin等等
2.有关字符集的问题
在计算机出现的早期,使用的字符集是旧版的ASCII字符集,在这种字符集中,使用7位表示一个字符,相应的,共128个可用的字符.后来,ASCII标准扩展到8位,同时支持一些其他拉丁语族的语言如法语西班牙语中不同于拉丁文的字符,同时包括了希腊文,还有一些其他字符如积分号等等.
但是仍然不够,亚洲,非洲有大量的非拉丁语族,希腊语族语言,并且很多使用字符文字而不是字母文字,这就造成了更大的麻烦。人们为了解决这个问题,就发明了针对不同文字的字符集,比如汉字的GB2312,GBk,繁体字的BIG5,ISO8859,还有如Latin等其他编码方式,这些编码方式规定了一定的数值映射到不同的字符上面。
但是这也造成了一定的困难,就是,相同的编码,用不同的字符集解释,变成了不同的字符,于是出现了бЇЯАзЪСЯ"、"�????????之类的令人生畏的乱码
于是人们再次提出了解决方案,那就是unicode编码,unicode是一个类的编码方式,但是都具有一个特点,就是一个编码对应唯一字符,防止解释成为不同字符。
3.UTF-8编码
现在最常用,也是国际通行的标准是unicode 8 也称为 UTF-8编码,基本编码方式如下
使用一至六个字节为每个字符编码(尽管如此,2003年11月UTF-8被RFC 3629重新规范,只能使用原来Unicode定义的区域,U+0000到U+10FFFF,也就是说最多四个字节):
128个US-ASCII字符只需一个字节编码(Unicode范围由U+0000至U+007F)。
带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母则需要两个字节编码(Unicode范围由U+0080至U+07FF)。
其他基本多文种平面(BMP)中的字符(这包含了大部分常用字,如大部分的汉字)使用三个字节编码(Unicode范围由U+0800至U+FFFF)。
其他极少使用的Unicode 辅助平面的字符使用四至六字节编码(Unicode范围由U+10000至U+1FFFFF使用四字节,Unicode范围由U+200000至U+3FFFFFF使用五字节,Unicode范围由U+4000000至U+7FFFFFFF使用六字节)。
注意,utf-8是一种变长编码,也就是不能一个一个字节来读,来解释的。UTF-8是ASCII的一个。因为一个纯ASCII字符串也是一个合法的UTF-8字符串,所以现存的ASCII文本不需要转换。为传统的扩展ASCII字符集设计的软件通常可以不经修改或很少修改就能与UTF-8一起使用。
4.python的str和unicode的问题
这两者有什么区别呢?
str是字符组成的序列
unicode 是unicode编码单元字节组成的序列
两者的相互转换关系
str decode成为unicode
unicode encode成为str
s="abc"
print type(s)
c=s.decode()
print type(c)
得到结果
<type 'str'>
<type 'unicode'>
注意转换时必须指定字符集