python 编码问题-文件编码格式和编码声明的作用
来源:互联网 发布:淘宝店主图怎么做 编辑:程序博客网 时间:2024/05/21 05:55
参考文章:http://www.jb51.net/article/26543.htm
摘取了对自己有用的片段,并进行格式整理
文件的编码格式和编码声明的作用
文件编码格式
源文件的编码格式对字符串的声明有什么作用呢?
文件的编码格式决定了在该源文件中声明的字符串的编码格式。
例如:
str = ‘哈哈’
print repr(str)
a.如果文件格式为utf-8,则str的值为:’\xe5\x93\x88\xe5\x93\x88’(哈哈的utf-8编码)
b.如果文件格式为gbk,则str的值为:’\xb9\xfe\xb9\xfe’(哈哈的gbk编码)
python中的字符串,只是一个字节数组,所以当把a情况的str输出到gbk编码的控制台时,就将显示为乱码:鍝堝搱;而当把b情况下的str输出utf-8编码的控制台时,也将显示乱码的问题,是什么也没有,也许’\xb9\xfe\xb9\xfe’用utf-8解码显示,就是空白吧。>_<
编码声明的作用
每个文件在最上面的地方,都会用# coding=gbk 类似的语句声明一下编码,但是这个声明到底有什么用呢?到止前为止,我觉得它的作用也就是三个:
1.声明源文件中将出现非ascii编码,通常也就是中文;
2.在高级的IDE中,IDE会将你的文件格式保存成你指定编码格式。
3.决定源码中类似于u’哈’这类声明的,解码是选择的解码格式。
看示例:
#encoding=gbkif __name__ == '__main__': ss = u'哈哈' print repr(ss) print 'ss:%s' % ss
将这个些代码保存成一个utf-8文本,运行,你认为会输出什么呢?大家第一感觉肯定输出的肯定是:
u'\u54c8\u54c8'ss:哈哈
但是实际上输出是:
u'\u935d\u581d\u6431'ss:鍝堝搱
为什么会这样?这就是编码声明在作怪了,在运行ss = u’哈哈’的时候,整个过程可以分为以下几步:
1) 获取’哈哈’的编码:由文件编码格式确定,为’\xe5\x93\x88\xe5\x93\x88’(哈哈的utf-8编码形式)
2) 转成 unicode编码的时候,在这个转换的过程中,对于’\xe5\x93\x88\xe5\x93\x88’的解码,不是用utf-8解码,而是用声明编码处指定的编码GBK,将’\xe5\x93\x88\xe5\x93\x88’按GBK解码,得到就是”鍝堝搱”,这三个字的unicode编码就是u’\u935d\u581d\u6431’,至止可以解释为什么print repr(ss)输出的是u’\u935d\u581d\u6431’ 了。
我们再来分析下一个示例:
#encoding:utf-8if __name__ == '__main__': ss = u'哈哈' print repr(ss) print 'ss:%s' % ss
将这个示例这次保存成GBK编码形式,运行结果,竟然是:
SyntaxError: (unicode error) 'utf8' codec can't decode byte 0xb9 in position 0:invalid start byte
这里为什么会有utf8解码错误呢?想想上个示例也明白了,转换第一步,因为文件编码是GBK,得到的是’哈哈’编码是GBK的编码’\xb9\xfe\xb9\xfe’,当进行第二步,转换成 unicode的时候,会用UTF8对’\xb9\xfe\xb9\xfe’进行解码,而大家查utf-8的编码表会发现,utf8编码表(关于UTF- 8解释可参见字符编码笔记:ASCII、UTF-8、UNICODE)中根本不存在,所以会报上述错误。
- python 编码问题-文件编码格式和编码声明的作用
- python 文件头的编码声明问题
- python编码声明问题
- python的编码声明
- Python文件编码的声明方法
- 文件的编码格式
- python创建文件的编码格式
- Python 查看文件的编码格式
- python 文件编码问题
- python一些编码的转换格式问题
- Python 中的文件编码格式
- python 设置文件编码格式
- Python查看文件编码格式
- 前端文件编码格式的问题
- Linux文件编码格式问题
- 计算机文件和编码格式
- 编码问题的思考-python编码问题
- python 中文编码声明
- 开发环境搭建
- 编程第九十一天
- JAVA各种系统架构图及其简介
- 按位与、或、异或等运算方法
- Android从Linux系统启动的步骤
- python 编码问题-文件编码格式和编码声明的作用
- CSS列表、表格、表单、高级选择器以及框模型
- 自定义系统右键菜单工具-使用说明
- -02-ORB算法的FPGA实现【特征点检测】
- windows 10驱动签名相关问题
- 动态规划--台阶问题
- Python描述符
- js之刷新父页面的各种方法汇总
- Ms sqlserver2008 R2大数据表的分区实现