首先要说明的是在python内部的编码为Unicode,在使用encode()与decode()两个方法时,都是将Unicode作为中间桥梁的。eg:
string.decode('utf-8') 表示将编码为‘utf-8’的字符串编码为Unicode。
string.encode('gb2312') 表示将Unicode编码为gb2312。
另外,常见的字符编码有ascii、Unicode、utf-8以及针对中文编码的gb2312。
1、ascii是一种针对英文、数字字符编码的方式,一共有127字符,采用一个字节来编码,比如:A采用ascii编码为十进制65。
2、Unicode是一种将中文以及所有语言编码进去的格式,Unicode一般采用两个字节来编码(有些生僻字符需要4个字节)。
3、utf-8是本着节约的精神出现的一种编码方式,因为如果采用Unicode进行编码,对于像英文字母的这种字符只需要一个字节就够了,那么用Unicode编码显然是有一些浪费的,由此utf-8出现了。它将Unicode编码转化为“可变长编码”,可以将一个Unicode字符编码为1-6个字节,英文1个字节,汉字通常3个字节,一些生僻的字符4-6个字节。
4、gb2312编码采用两个字节来编码一个汉字。
(补充一些基本知识:因为计算机只认识01数字,而计算机被设计为1个字节(byte)有8个比特(bit),因此,如果用一个字节来表示字符的话,最大只能表示到255,对于我们博大精深的汉字来说是远远不够的。因此在gb2312编码中采用两个字节来编码一个汉字。其中两个字节可以表示到65535)
接下来是一些在调试python程序时遇到的一些编码问题:
eg:UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position ... 遇到这个问题时,是在将网络数据流写进本地文件时出现的。
因为在windows下,新文件的默认编码为gbk,这样的话,python解释器或用gbk编码去解析我们的网络数据流,而我们的网络数据流并不一定是gbk编码的,所以解决办法是,改变目标文件的编码:
fp=open('xxxx.html','w', encoding='utf-8')