微科社区,轻松开发从此开始! 请登陆 免费注册

微科社区

当前位置:首页 > 编程语言 > 脚本语言 >

python2.x 默认编码问题

时间:2016-10-04 23:29  浏览:努力统计中...
python2.x中处理中文,是一件头疼的事情。网上写这方面的文章,测次不齐,而且都会有点错误,所以在这里打算自己总结一篇文章。 我也会在以后学习中,不断的修改此篇博客。 这里

python2.x中处理中文,是一件头疼的事情。网上写这方面的文章,测次不齐,而且都会有点错误,所以在这里打算自己总结一篇文章。

我也会在以后学习中,不断的修改此篇博客。

这里假设读者已有与编码相关的基础知识,本文不再再次介绍,包括什么是utf-8,什么是unicode,它们之间有什么关系。
str与字节码

首先,我们完全不谈unicode。
 

?
1s = "人生苦短"

s是个字符串,它本身存储的就是字节码。那么这个字节码是什么格式的?

如果这段代码是在解释器上输入的,那么这个s的格式就是解释器的编码格式,对于windows的cmd而言,就是gbk。

如果将段代码是保存后才执行的,比如存储为utf-8,那么在解释器载入这段程序的时候,就会将s初始化为utf-8编码。
unicode与str

我们知道unicode是一种编码标准,具体的实现标准可能是utf-8,utf-16,gbk ……

python 在内部使用两个字节来存储一个unicode,使用unicode对象而不是str的好处,就是unicode方便于跨平台。

你可以用如下两种方式定义一个unicode:
 

?
12s1 = u"人生苦短"s2 = unicode("人生苦短", "utf-8")
encode与decode

在python中的编码解码是这样的:

201533090956961.jpg (600×338)

北京动力节点java培训【点击进入】动力节点-口口相传的java黄埔军校, 专注java教学7年,老学员力荐品牌.查 看   

 

 

所以我们可以写这样的代码:
 

?
123456789# -*- coding:utf-8 -*-su = "人生苦短"# : su是一个utf-8格式的字节串u = s.decode("utf-8")# : s被解码为unicode对象,赋给usg = u.encode("gbk")# : u被编码为gbk格式的字节串,赋给sgprint sg# 打印sg

但是事实情况要比这个复杂,比如看如下代码:
 

?
12s = "人生苦短"s.encode('gbk')
看!str也能编码,(事实上unicode对象也能解码,但是意义不大)

这样为什么可以?看上图的编码流程的箭头,你就能想到原理,当对str进行编码时,会先用默认编码将自己解码为unicode,然后在将unicode编码为你指定编码。

这就引出了python2.x中在处理中文时,大多数出现错误的原因所在:python的默认编码,defaultencoding是ascii

看这个例子:
 

?
123# -*- coding: utf-8 -*-s = "人生苦短"s.encode('gbk')

上面的代码会报错,错误信息:UnicodeDecodeError: ‘ascii' codec can't decode byte ……

因为你没有指定defaultencoding,所以它其实在做这样的事情:

?
123
TAG:
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线------