python 相关编码[转]
(一)
怎么避免UnicodeEncodeError: ‘ascii’ codec can’t…类似的错误?
1、首先在py文件头部指定文件内容编码,例如:# coding: utf8
2、文件保存的时候要和py文件头部编码一致
3、在用decode和encode的时候,一定要确认要转换的字符原编码是什么。
例如:网页中都会指定编码(<meta http-equiv=content-type content=”text/html; charset=gb2312″>), 你在抓取这个网站并获取它的html后进行编码转化就要注意了:
import urllib2
html = urllib2.urlopen(url)
html = html.decode(‘gb2312′)
只要做上面三个就不会出现转换编码错误了
python建议,在python代码中最好所有变量都是unicode; 流程可以这么写: 变量(转换成unicode)——>python代码——–>变量(转换成其他编码)
sys.getdefaultencoding():系统的缺省编码(一般就是ascii),python默认语言的编码是ascii编码, 这就是为什么在py文件的头部都要指定编码了# coding:utf-8
Python获取系统编码参数的几个函数
系统的缺省编码(一般就是ascii):sys.getdefaultencoding() 系统当前的编码:locale.getdefaultlocale() 系统代码中临时被更改的编码(通过locale.setlocale(locale.LC_ALL,“zh_CN.UTF-8″)):locale.getlocale() 文件系统的编码:sys.getfilesystemencoding() 终端的输入编码:sys.stdin.encoding 终端的输出编码:sys.stdout.encoding 代码的缺省编码:文件头上# -*- coding: utf-8 –*-
来源:http://justpy.com/archives/144
(二)
更多:
http://www.cnblogs.com/itrust/archive/2010/05/14/1735185.html
字符串
python有两种字符串
1
2
|
byteString = "hello world! (in my default locale)" unicodeString = u "hello Unicode world!" |
相互转换
1
2
3
4
|
1 s = "hello normal string" 2 u = unicode ( s, "utf-8" ) 3 backToBytes = u.encode( "utf-8" ) 3 backToUtf8 = backToBytes.decode(‘utf - 8 ’) #与第二行效果相同 |
如何判断
1
2
3
|
if isinstance ( s, str ): # 对Unicode strings,这个判断结果为False if isinstance ( s, unicode ): # 对Unicode strings,这个判断结果为True if isinstance ( s, basestring ): # 对两种字符串,返回都为True |
做个试验
1
2
3
4
5
6
|
import sys print 'default encoding: ' , sys.getdefaultencoding() print 'file system encoding: ' , sys.getfilesystemencoding() print 'stdout encoding: ' , sys.stdout.encoding print u 'u"中文" is unicode: ' , isinstance (u '中文' , unicode ) print u '"中文" is unicode: ' , isinstance ( '中文' , unicode ) |
看输出结果,注意下列事实:
python系统缺省的编码格式为ASCII,这个缺省编码在Python转换字符串时用的到,这里给两个例子:
1. a = "abc" + u"bcd", Python会如此转换"abc".decode(sys.getdefaultencoding()) 然后将两个Unicode字符合并。
2. print unicode('中文') , 这句话执行会出错“UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 …”,是因为Python试图用缺省编码来编码,而这个字符串不是ASCII,因此需要显示的指出,如果你的文件源类型为utf-8,则应如此:print unicode('中文','utf-8’)
Windows下getfilesystemencoding输出mbcs(多字节编码,windows的mbcs,也就是ansi,它会在不同语言的windows中使用不同的编码,在中文的windows中就是gb系列的编码)
Windows下控制台编码为cp936, 当你打印东西到控制台时Python自动做了转换。这里会引发一个有趣的问题, 试一下这个简单的例子test.py:
1
2
3
|
# -*- coding: utf-8 -*- s = u '中文' print s |
在控制台中分别运行 python test.py 和 python test.py > 1.txt
你会发现后者会报错,原因是打印控制台时Python会自动转换编码到sys.stdout.encoding, 而输出到文件时Python不会自动在write调用中进行内部字符转换。这个问题在PrintFails中有较详细的说明。
UTF-8编码格式
保存utf-8格式的文件
1
2
3
|
import codecs fileObj = codecs. open ( "someFile" , "r" , "utf-8" ) u = fileObj.read() # Returns a Unicode string from the UTF-8 bytes in the file |
自己写BOM头
1
2
3
4
|
out = file ( "someFile" , "w" ) out.write( codecs.BOM_UTF8 ) out.write( unicodeString.encode( "utf-8" ) ) out.close() |
自己去掉BOM头
对UTF-16, Python将BOM解码为空字串。然而对UTF-8, BOM被解码为一个字符,如例:
1
2
3
4
|
>>> codecs.BOM_UTF16.decode( "utf16" ) u'' >>> codecs.BOM_UTF8.decode( "utf8" ) u '\ufeff' |
不知道为什么会这样不同,因此你需要在读文件时自己去掉BOM:
1
2
3
4
5
6
7
8
9
10
11
|
import codecs if s.beginswith( codecs. BOM_UTF8 ): # The byte string s begins with the BOM: Do something. # For example, decode the string as UTF-8 if u[ 0 ] == unicode( codecs. BOM_UTF8 , "utf8" ): # The unicode string begins with the BOM: Do something. # For example, remove the character. # Strip the BOM from the beginning of the Unicode string, if it exists u.lstrip( unicode( codecs. BOM_UTF8 , "utf8" ) ) |
源码文件的编码
关于Python对代码文件的编码处理,PEP0263 讲的很清楚,现摘录如下
python缺省认为文件为ASCII编码。
可在代码头一行或二行加入声明文件编码申明,通知python该文件的编码格式,如
# -*- coding: utf-8 –*- # 注意使用的编辑器,确保文件保存时使用了该编码格式
- 对于Windows这样的平台,它使用了BOM(文件头三个字节 \xef\xbb\xbf)来申明文件为utf-8编码,这种情况下:
- 如果文件中没有编码申明,python以utf8处理
- 如果有编码申明但不是utf-8, python报错
==============另外,关于BOM================
(三)
某些软件,如notepad,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。 因此我们在读取时需要自己去掉这些字符,python中的codecs module定义了这个常量:
1
2
3
4
5
6
|
# coding=gbk import codecs data = open ( "Test.txt" ).read() if data[: 3 ] = = codecs.BOM_UTF8: data = data[ 3 :] print data.decode( "utf-8" ) |
python 相关编码[转]的更多相关文章
- 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸
类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...
- python的编码问题
本文简单介绍了各种常用的字符编码的特点,并介绍了在python2.x中如何与编码问题作战 :) 请注意本文关于Python的内容仅适用于2.x,3.x中str和unicode有翻天覆地的变化,请查阅其 ...
- Python 字符编码 zz
http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html 1. 字符编码简介 1.1. ASCII ASCII(American Stan ...
- Python字符编码详解
1. 字符编码简介 1.1. ASCII ASCII(American Standard Code for Information Interchange),是一种单字节的编码.计算机世界里一开始只有 ...
- 【转】Python字符编码详解
转自:http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html 1. 字符编码简介 1.1. ASCII ASCII(American S ...
- 深入理解Python字符编码--转
http://blog.51cto.com/9478652/2057896 不论你是有着多年经验的 Python 老司机还是刚入门 Python 不久,你一定遇到过UnicodeEncodeError ...
- 深入理解Python字符编码
不论你是有着多年经验的 Python 老司机还是刚入门 Python 不久,你一定遇到过UnicodeEncodeError.UnicodeDecodeError 错误,每当遇到错误我们就拿着 enc ...
- Python字符编码以及循环机制介绍
Python字符编码以及循环机制介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 身为一名运维人员就得不断的学习,那么如何身为运维的你是否已经嗅探已经很火的Python编程啦?大 ...
- 【安全开发】python安全编码规范
申明:本文非笔者原创,原文转载自:https://github.com/SecurityPaper/SecurityPaper-web/blob/master/_posts/2.SDL%E8%A7%8 ...
随机推荐
- c++ _宏与内联函数
第一部分:宏为什么要使用宏呢?因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方.这种转移操作要求在转去执行前要保存现场并 ...
- Java编程环境eclipse配置
一. 下载并安装JDK https://www.cnblogs.com/zhangchao0515/p/6806408.html 二.下载并解压Eclipse https://www.cnblogs. ...
- 【网络爬虫】【python】网络爬虫(一):python爬虫概述
python爬虫的实现方式: 1.简单点的urllib2 + regex,足够了,可以实现最基本的网页下载功能.实现思路就是前面java版爬虫差不多,把网页拉回来,再正则regex解析信息--总结起来 ...
- Linux下共享库嵌套依赖问题 (转载)
转自:http://my.oschina.net/moooofly/blog/506466 问题场景: 动态库 librabbitmq_r.so 内部依赖动态库 libevent_core.so 和 ...
- MySQL备份与主备配置
MySQL备份与主备配置 数据备份类型 全量备份:备份整个数据库 增量备份:备份自上一次备份以来(增量或完全)以来变化的数据 差异备份:备份自上一次完全备份以来变化的数据 全量备份 全量备份的方法有 ...
- npm 的安装与使用
创建: 2019/04/06 完成: 2019/04/07 安装 npm写在node.js里, 故安装node.js即可 https://nodejs.org/en/download/ 确认是否安装 ...
- 洛谷 - P3966 - 单词 - AC自动机
https://www.luogu.org/problemnew/show/P3966 因为文本串就是字典本身,所以这个和平时的AC自动机不太一样.平时的query要沿着fail树把子树的出现次数依次 ...
- 51nod1402(贪心)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1402 题意:中文题诶- 思路:贪心 对于一个桩点,如果我们只考 ...
- [Xcode 实际操作]九、实用进阶-(17)使用CGBlendMode改变UIImage颜色,实现对图片进行混合着色
目录:[Swift]Xcode实际操作 本文将演示如何使用CGBlendMode改变UIImage颜色,实现对图片进行混合着色. 在项目文件夹[DemoApp]上点击鼠标右键 ->[New Fi ...
- apringboot aop权限控制
+ 定义切面: ···@Aspect @Component public class LoginInterceptor { @Around("@annotation(lock)") ...