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 –*-   # 注意使用的编辑器,确保文件保存时使用了该编码格式

  1. 对于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 相关编码[转]的更多相关文章

  1. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

    类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...

  2. python的编码问题

    本文简单介绍了各种常用的字符编码的特点,并介绍了在python2.x中如何与编码问题作战 :) 请注意本文关于Python的内容仅适用于2.x,3.x中str和unicode有翻天覆地的变化,请查阅其 ...

  3. Python 字符编码 zz

    http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html 1. 字符编码简介 1.1. ASCII ASCII(American Stan ...

  4. Python字符编码详解

    1. 字符编码简介 1.1. ASCII ASCII(American Standard Code for Information Interchange),是一种单字节的编码.计算机世界里一开始只有 ...

  5. 【转】Python字符编码详解

    转自:http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html 1. 字符编码简介 1.1. ASCII ASCII(American S ...

  6. 深入理解Python字符编码--转

    http://blog.51cto.com/9478652/2057896 不论你是有着多年经验的 Python 老司机还是刚入门 Python 不久,你一定遇到过UnicodeEncodeError ...

  7. 深入理解Python字符编码

    不论你是有着多年经验的 Python 老司机还是刚入门 Python 不久,你一定遇到过UnicodeEncodeError.UnicodeDecodeError 错误,每当遇到错误我们就拿着 enc ...

  8. Python字符编码以及循环机制介绍

    Python字符编码以及循环机制介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 身为一名运维人员就得不断的学习,那么如何身为运维的你是否已经嗅探已经很火的Python编程啦?大 ...

  9. 【安全开发】python安全编码规范

    申明:本文非笔者原创,原文转载自:https://github.com/SecurityPaper/SecurityPaper-web/blob/master/_posts/2.SDL%E8%A7%8 ...

随机推荐

  1. Word2013 在一个页面双列显示

    1. 效果图 2. 实现方法 (1) 进入页面布局 (2) 选中要整理的字,选中Columns,然后选择Two

  2. KNN分类算法--python实现

    一.kNN算法分析 K最近邻(k-Nearest Neighbor,KNN)分类算法可以说是最简单的机器学习算法了.它采用测量不同特征值之间的距离方法进行分类.它的思想很简单:如果一个样本在特征空间中 ...

  3. 1.5 sqoop安装及基本使用

    一.安装sqoop 1.解压 ##解压 [root@hadoop-senior cdh]# tar zxf sqoop-1.4.5-cdh5.3.6.tar.gz -C /opt/cdh-5.3.6/ ...

  4. mptcp文献汇总

    1 https://www.blackhat.com/docs/us-14/materials/us-14-Pearce-Multipath-TCP-Breaking-Todays-Networks- ...

  5. 一道关于chm设计ctf钓鱼的一些思考

    版权声明:本文为博主的原创文章,未经博主同意不得转载 题目:flag就是文件指向的地址 文件: 作为一名web狗的出题人,这道ctf有点意思不是在于因为它难,而是相对于一些代码审计以及一些杂项题来说, ...

  6. 服务迁移之路 | Spring Cloud向Service Mesh转变

    一.导读 Spring Cloud基于Spring Boot开发,提供一套完整的微服务解决方案,具体包括服务注册与发现,配置中心,全链路监控,API网关,熔断器,远程调用框架,工具客户端等选项中立的开 ...

  7. 3DMAX 如何将删去的面补回来

    1.例如下面长方体被删除一个面 2.点击主键盘区数字键[3] ,进入[边界]修改模式 ,使用鼠标点击 被删除面的边界,并点击[修改面板]---[封口],例如下图:

  8. cogs 1176. [郑州101中学] 月考

    1176. [郑州101中学] 月考 ★   输入文件:mtest.in   输出文件:mtest.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] 在上次的月考中Bug ...

  9. [Xcode 实际操作]一、博主领进门-(5)检测运行中的模拟器在各个方向上的切换

    目录:[Swift]Xcode实际操作 本文将演示Xcode的设备模拟器在各个方向上的切换和检测. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] 检测运行中的模拟 ...

  10. css定位-position

    前言 定位的目的就是把元素摆放到指定的位置. 定位上下文:定位元素的大小,位置都是相对于定位上下文的. position属性值有5个值 static:所有有元素定位默认的初始值都是static.就是不 ...