转python编码问题
前两天理解了unicode、utf-8、gb2312这些编码之间的关系以后,今天终于弄明白了在python里面的编码问题。我们在写python脚本时如果有中文的字符串,在运行的时候有可能会报错也有可能会出现乱码。一般加上# -*- coding:utf-8 -*-就不会报错了,但是还可能有乱码问题,而且同样的代码在不同的编辑器中得出的结果还有可能不一样,你是否也遇到过这些问题而且理不清头绪?希望我的讲解能让你对这个问题有一定的理解。
对于python的一个脚本来说有三种编码:
1. 脚本文件的编码
脚本保存时的编码格式,不同的编辑器采用的格式不同会造成一定的混乱,一般是utf-8或者cp936(windows上)
2. python解析器的编码
python默认使用ascci编码,所以如果你的脚本中出现了中文,用ascci编码区解析一定会出错,因为ascci不没有utf-8,cp936里面的中文字符的。所以你要在脚本的第一行加入# -*- coding:utf-8 -*-注释来通知python解析器使用utf-8,但是这个只是通知一下python而不是真的用utf-8的编码区解析这里的中文字符串。例如,你写了一个脚本保存的编码是cp936的,如果不加入注释一定会在运行时报错,因为ascci不包括cp936里面的字符,而你写了第一行的注释就不会报错了因为utf-8中有这个字符,但是字符的含义未必是那个中文,它仅仅是处理一下。这里有个地方需要注意如果你的脚本保存时的编码是utf-8的就不需要第一行的注释,python会正确识别。我个人理解是python只识别utf-8和ansi两种格式的文件,ansi格式的需要明确指出coding,否则python默认使用ascci来处理
3. 运行脚本的环境的编码
如果运行环境的编码格式与脚本文件的格式相同就正确显示,不同就是乱码,因为运行环境会进行解码
还是看看代码吧:
# -*- coding:utf-8 -*- #如果没有这句会报错,默认的ascci无法解析cp936编码
# cp936编码保存
str = 'abc中文'
print str#cmd中正确显示,因为cmd是cp936编码
ustr = u'abc中文'#报错,因为无法用utf-8的格式去对cp936进行解码,
ustr1 = unicode(str, 'cp936')#正确, 因为解码用的编码与文件存储的编码相同
=============================================
# utf-8编码保存
str = 'abc中文'
print str#cmd #不会报错但是显示为乱码,如果放到cygwin中执行显示正确,因为cygwin的bash是utf-8的
ustr = u'abc中文'#正确,因为python对utf-8编码的文件默认使用utf-8编码集
print ustr#正常显示,因为unicode是"通用“的编码集,可以被转化成其他的编码方式
==============================================
# unicode编码保存,实际为utf-16le
str = 'abc'#报错,因为utf-16的编码会在开头加入 FFFE两个字节,这个时候python会默认使用ascci来处理,因为就算你加了# -*- coding:utf-16 -*- 也没用,因为python还没解析到这句就已经解析失败了
转python编码问题的更多相关文章
- (转载) 浅谈python编码处理
最近业务中需要用 Python 写一些脚本.尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息. 很快,我就遇到了异常: UnicodeEncodeError: ...
- Python 编码简单说
先说说什么是编码. 编码(encoding)就是把一个字符映射到计算机底层使用的二进制码.编码方案(encoding scheme)规定了字符串是如何编码的. python编码,其实就是对python ...
- Python之路3【知识点】白话Python编码和文件操作
Python文件头部模板 先说个小知识点:如何在创建文件的时候自动添加文件的头部信息! 通过:file--settings 每次都通过file--setings打开设置页面太麻烦了!可以通过:View ...
- python编码规范
python编码规范 文件及目录规范 文件保存为 utf-8 格式. 程序首行必须为编码声明:# -*- coding:utf-8 -*- 文件名全部小写. 代码风格 空格 设置用空格符替换TAB符. ...
- 【转】python编码的问题
摘要: 为了在源代码中支持非ASCII字符,必须在源文件的第一行或者第二行显示地指定编码格式: # coding=utf-8 或者是: #!/usr/bin/python # -*- coding: ...
- 【转】python编码规范
http://blog.csdn.net/willhuo/article/details/49300441 决定开始Python之路了,利用业余时间,争取更深入学习Python.编程语言不是艺术,而是 ...
- python 编码 UnicodeDecodeError
将一个py脚本从Centos转到win运行,出错如下: UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position 0: il ...
- Python编码/文件读取/多线程
Python编码/文件读取/多线程 个人笔记~~记录才有成长 编码/文件读取/多线程 编码 常用的一般是gbk.utf-8,而在python中字符串一般是用Unicode来操作,这样才能按照单个字 ...
- 关于Python编码,超诡异的,我也是醉了
Python的编码问题,真是让人醉了.最近碰到的问题还真不少.比如中文文件名.csv .python对外呈现不一致啊,感觉好不公平. 没图说个JB,下面立马上图. 我早些时候的其他脚本,csv都是 ...
- 规范的python编码
规范的 python 编码令人赏心悦目,令代码的表达逻辑更清晰,使得工程代码更容易被维护和交流: 编码规范包括对于代码书写格式的约束,不良语法的禁用和推荐的编码手法,下面做些简要的描述: 1. 代码规 ...
随机推荐
- 拓扑排序--UVa10305
题目 Output: standard output Time Limit: 1 second Memory Limit: 32 MB John has n tasks to do. Unfortun ...
- LINQ之路 3:C# 3.0的语言功能(下)
在LINQ介绍一篇中,我们已经看到了隐式类型变量var,扩展方法(Extension method)和Lambda表达式的身影.没错,他们正是LINQ技术的基石,是他们让LINQ的实现成为可能,并且简 ...
- 【T-SQL系列】临时表、表变量
临时表临时表与永久表相似,只是它的创建是在Tempdb中,它只有在一个数据库连接结束后或者由SQL命令DROP掉,才会消失,否则就会一直存在.临时表在创建的时候都会产生SQL Server的系统日志, ...
- iOS - UILabel
前言 NS_CLASS_AVAILABLE_IOS(2_0) @interface UILabel : UIView <NSCoding> @available(iOS 2.0, *) p ...
- PHP面向对象(OOP)编程入门教程————如何实例化对象?
我们上面说过面向对象程序的单位就是对象,但对象又是通过类的实例化出来的,既然我们类会声明了,下一步就是实例化对象了. 当定义好类后,我们使用new关键字来生成一个对象. $对象名称 = new 类名称 ...
- mysql概要(四)order by,group 的特点,子查询
1.order by 默认按升序排列(asc/desc),多字段排序 order by 字段 排序方式,字段2 排序方式,..:在分组排序中,排序是对分组后的结局进行排序,而不是在组中进行排序. 2. ...
- Java源码初学_LinkedList
一.LinkedList的内部数据结构 LinkedList底层是一个链表的数据结构,采用的是双向链表,基本的Node数据结构代码如下: private static class Node<E& ...
- 【Todo】【读书笔记】Java多线程编程指南-设计模式篇
下了这本书<Java多线程编程指南-设计模式篇>, 还有另一本<JAVA多线程设计模式>,据说内容有重复,结合着看.
- TCP/IP,Http,Socket,XMPP的区别
大学学习网络基础的时候老师讲过,网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层.通过初步的了解,我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用 ...
- Android最佳性能实践(二)——分析内存的使用情况
由于Android是为移动设备开发的操作系统,我们在开发应用程序的时候应当始终把内存问题充分考虑在内.虽然Android系统拥有垃圾自动回收机制,但这并不意味着我们就可以完全忽略何时去分配或释放内存. ...