对于encode和decode,笔者也是根据自己的理解,有不对的地方还请多多指点。
编码的理解:
1.编码:utf-8,utf-16,gbk,gb2312,gb18030等,编码为了便于理解,可以把它当做一个算法,用于加密和解密。基类编码字符集:unicode等,基类编码字符集可以理解为明文。其他编码字符集: ANSCII,汉字等,其他类编码字符集可以理解为密文。三者的关系是明文用算法加密成密文,密文用算法解密成明文。
2.Python 默认脚本文件都是 ANSCII 的,当代码中有非 ANSCII 码范围内的字符的时候(汉字及其他字符)。 则需要在程序的第一行或第二行指定编码声明:
# -*- coding=utf-8 -*-或者 #coding=utf-8 其他的编码如:gbk、gb2312也可以; 否则会出现类似:SyntaxError: Non-ASCII character '/xe4' in file ChineseTest.py on line 1, but no encoding declared; see http://www.pytho for details这样的异常信息。
编码转换:
一个str转换成特定编码类型,需要把str转为Unicode,然后从unicode转为特定的编码类型如:utf-8、gb2312等。
如何确认str类型的编码:
对于str类型可以理解为密文,我们需要通过decode或者unicode函数来进行解密,如下面例子:
>>> a="我"
>>> print unicode(a,"utf-8")
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
print unicode(a,"utf-8")
UnicodeDecodeError: 'utf8' codec can't decode byte 0xce in position 0: invalid continuation byte
“我”字解码时却出现了UnicodedecodeError,说明"我"不是用utf-8编码的,那就换个编码方式:gbk
>>> print unicode(a,"gbk")
我
>>> print a.decode("gbk")
我
ASCII与Unicode区别:
>>> "Hello World" #ASCII string,密文
'Hello World'
>>> u"Hello World" #Unicode string,明文
u'Hello World'
Encode和Decode:
1.encode():顾名思义是加密的意思,主要用于编码。
#将Unicode转换成普通的Python字符串:"编码(encode)"
unicodestring = u"Hello world"
utf8string = unicodestring.encode("utf-8")
asciistring = unicodestring.encode("ascii")
isostring = unicodestring.encode("ISO-8859-1")
utf16string = unicodestring.encode("utf-16")
编码不符主要报错:
UnicodeEncodeError: ******: illegal multibyte sequence
2.decode():解码的意思,主要用于解码
#将普通的Python字符串转换成Unicode: "解码(decode)"
plainstring1 = unicode(utf8string, "utf-8")
plainstring2 = unicode(asciistring, "ascii")
plainstring3 = unicode(isostring, "ISO-8859-1")
plainstring4 = unicode(utf16string, "utf-16")
解码不符主要报错:UnicodeDecodeError:*******: invalid continuation byte
3.decode()和Unicode()的意思相同,都是用于解码,以下是官方语法:
S.decode([encoding[,errors]]) -> string or unicode
unicode(string[, encoding[, errors]]) -> unicode object