0%

Python kill编码问题

之前在遇到字符串编码问题的时候都是跑到网上现去查资料,而且一直分不清 decodeencode 到底那个是解码,那个是编码,每次用的时候还要查一下文档,本次就做一个了断吧!

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 编码。

因此转码的时候一定先搞明白,字符串是什么编码,然后 decodeunicode,再然后 encode 成其他编码。

代码中字符串的编码与代码文件的编码一致

如果这样写 s = u'中国' ,该字符串的编码就被指定为了 unicode 了,即 Python 的内部编码,而与代码文件本身编码无关,因此对于这种情况做编码转换,只需直接使用 encode 方法将其转换成指定编码即刻。

如果对一个 unicode 字符串进行解码将会报错,所以可以使用 isinstance(s, unicode) 来判断是否为 unicode

unicode 编码的字符串使用 encode 会报错。

unicode(str, 'gbk')str.decode('gbk') 是一样的,都是将 gbk 编码的字符串转为 unicode 编码。


唉,想起来之前有个非常耻辱的事,就是有次面试的时候对方问我 Python 中默认字符编码是什么,我回答的是: ascii

还问我Python中如何进行编码和解码,其实我知道是用 decodeencode 但当时真的分不清楚哪个是做什么用的,所以忘了当时回答的对不对了。

为了让自己把 decodeencode 分清楚,我想了个办法, decode 开头发音是 弟(di),所以弟就应该有个姐姐,所以 decode 就是解码,另外一个 encode 就自然是编码了。哈哈哈。

对方还问了我,utf8unicode 有什么区别,后来查了下资料,结论是: UTF-8是Unicode的实现方式之一。 详情见阮一峰老师的博客