之前在遇到字符串编码问题的时候都是跑到网上现去查资料,而且一直分不清
decode
和encode
到底那个是解码,那个是编码,每次用的时候还要查一下文档,本次就做一个了断吧!
Python 内部字符串编码为 unicode
,因此在编码转换时,通常使用 unicode
作为中间编码, 先将其他编码的字符串解码(decode)成 unicode
,再从 unicode
编码(encode)成另一种编码。
unicode
世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。为什么电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。
可以想象,如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是unicode
,就像它的名字都表示的,这是一种所有符号的编码。
decode
decode
的作用是将其他编码的字符串解码成 unicode
编码。
如 str.decode('gbk')
,表示将 gbk
编码的字符串解码成 unicode
编码。
encode
encode
的作用是将 unicode
字符串编码成其他编码的字符串。
如 str.encode('gbk')
, 表示将 unicode
编码的字符串编码成 gbk
编码。
因此转码的时候一定先搞明白,字符串是什么编码,然后
decode
成unicode
,再然后encode
成其他编码。
代码中字符串的编码与代码文件的编码一致
如果这样写 s = u'中国'
,该字符串的编码就被指定为了 unicode
了,即 Python
的内部编码,而与代码文件本身编码无关,因此对于这种情况做编码转换,只需直接使用 encode
方法将其转换成指定编码即刻。
如果对一个 unicode
字符串进行解码将会报错,所以可以使用 isinstance(s, unicode)
来判断是否为 unicode
。
非 unicode
编码的字符串使用 encode
会报错。
unicode(str, 'gbk')
和 str.decode('gbk')
是一样的,都是将 gbk
编码的字符串转为 unicode
编码。
唉,想起来之前有个非常耻辱的事,就是有次面试的时候对方问我 Python 中默认字符编码是什么,我回答的是: ascii
还问我Python中如何进行编码和解码,其实我知道是用 decode
和 encode
但当时真的分不清楚哪个是做什么用的,所以忘了当时回答的对不对了。
为了让自己把 decode
和 encode
分清楚,我想了个办法, decode
开头发音是 弟(di)
,所以弟就应该有个姐姐,所以 decode
就是解码,另外一个 encode
就自然是编码了。哈哈哈。
对方还问了我,utf8
和 unicode
有什么区别,后来查了下资料,结论是: UTF-8是Unicode的实现方式之一。 详情见阮一峰老师的博客