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")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351331.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百度的html代码是什么,百度网页源代码是什么?

2017-07-28Java抓取网页的内容代码是什么public static String getHtmlReadLine(String httpurl){String CurrentLine”";String TotalString”";InputStream urlStream;String content”";try {URL url new URL(httpurl);// URL url new URL(“http://www。 …

html中高与行高的区别,深入了解css的行高Line Height属性

什么是行间距&#xff1f;古时候我们是用印刷机来处理文字&#xff0c;印出来的每个字都位于独立的一个块里。行间距&#xff0c;即传说中控制两行文字之间垂直距离的东东。在CSS&#xff0c;line-height被用来控制行与行之间的垂直距离。不过行间距与半行间距还是取决于CSS中的…

自动生成优化的Java类专业知识

如果您今年访问过JavaOne&#xff0c;您可能已经参加了我的演讲“如何从数据库生成定制的Java 8代码”。 在那次演讲中&#xff0c;我展示了如何使用Speedment Open Source工具包使用数据库作为域模型来生成各种Java代码。 我们没有时间要考虑的一件事是&#xff0c;Speedment不…

vue动态路由配置,vue路由传参

如果是不同的组件过来的&#xff0c;可以设置不同的id值&#xff0c;只要在目标组件获取属性id的值就可以了&#xff0c;参数就利用query.属性值来获取 转载于:https://www.cnblogs.com/xiaoqi2018/p/10434318.html

Linux Netcat 命令——网络工具中的瑞士军刀

netcat是网络工具中的瑞士军刀&#xff0c;它能通过TCP和UDP在网络中读写数据。通过与其他工具结合和重定向&#xff0c;你可以在脚本中以多种方式使用它。使用netcat命令所能完成的事情令人惊讶。 netcat所做的就是在两台电脑之间建立链接并返回两个数据流&#xff0c;在这之后…

win10怎么放计算机在桌面,win10我的电脑怎么放在桌面

win10我的电脑图标怎么放在桌面呢&#xff1f;一不小心将win10桌面上的此电脑图标删除了&#xff0c;找了半天都没找到它。win10系统怎么将我的电脑图标藏的隐蔽。今天&#xff0c;我就将找回win10我的电脑图标方法分享给你们刚重装完win10系统有些小伙伴就急急忙忙的来询问小编…

project 2013 显示标题

1、分析 右键只能插入任务&#xff0c;不能插入标题&#xff0c;而插入任务会被编号&#xff0c;目前只能在打印设置标题&#xff0c;不能在编辑界面显示标题的&#xff0c;或者使用最高级任务的方式 2、解决 文件&#xff0c;打印&#xff0c;页面设置&#xff0c;页眉&#x…

getopt在Python中的使用

在运行程序时&#xff0c;可能需要根据不同的条件&#xff0c;输入不同的命令行选项来实现不同的功能。目前有短选项和长选项两种格式。短选项格式为"-"加上单个字母选项&#xff1b;长选项为"--"加上一个单词。长格式是在Linux下引入的。许多Linux程序都支…

大数据的数据采集数据处理_让我们处理大数据

大数据的数据采集数据处理作为开发人员&#xff0c;我们的重点是简单&#xff0c;有效的解决方案&#xff0c;因此&#xff0c;最有价值的原则之一就是“保持简单和愚蠢”。 但是使用Hadoop map-reduce很难坚持这一点。 如果我们要评估多个Map Reduce作业中的数据&#xff0c;我…

怎样正确使用和维护微型计算机,下篇:微型计算机应该怎样进行维护与保养

2. 养成良好的使用维护习惯(1)正确的使用习惯个人使用习惯对计算机的影响很大&#xff0c;首先是要正常开关机&#xff0c;开机的顺序是&#xff0c;先打开外设的电源&#xff0c;然后再开主机电源。关机顺序相反&#xff0c;先关闭主机电源&#xff0c;再关闭外设电源。其道理…

CF :K 一个含n条边的带权无向连通图,q次查询,每次查询两点间的最短距离。...

题意&#xff1a;给你一个含n条边的带权无向连通图&#xff0c;q次查询&#xff0c;每次查询两点间的最短距离。 思路&#xff1a;LCA思维。 设a&#xff0c;b两点间的距离为f(a,b) 则f(a,b)dis[a]dis[b]-2*dis[lca(a,b)]; 由于n条边&#xff0c;因此我们先任取一条边&#xff…

每天一个linux命令(20):find命令之exec

find是我们很常用的一个Linux命令&#xff0c;但是我们一般查找出来的并不仅仅是看看而已&#xff0c;还会有进一步的操作&#xff0c;这个时候exec的作用就显现出来了。 exec解释&#xff1a; -exec 参数后面跟的是command命令&#xff0c;它的终止是以;为结束标志的&#x…

英语作业介绍一项发明计算机,介绍电脑的发明的英语作文

匿名用户1级2008-07-25 回答Simple 1:Different eras of political history are frequently identified with royal dynasties, or great wars and revolutions.Eras in the history of art and architecture may be distinguished by styles such as Renaissance, Gothic, Imp…

Math、Date内置对象方法整理

Math : 内置的对象&#xff08;构造函数&#xff09;静态属性或静态方法。一、Math.PI : 圆周率console.log(Math.PI);二、近似值1. 四舍五入 &#xff1a; Math.round()注: 负数时&#xff0c; < 0.5 舍去 > 0.5 进一console.log(Math.round(4.5)); //5console…

Neo4j:动态添加属性/设置动态属性

我一直在研究一个包含英国国家铁路时刻表的数据集&#xff0c;它们以文本格式为您提供每列火车的出发和到达时间。 例如&#xff0c;可以这样创建代表停止的节点&#xff1a; CREATE (stop:Stop {arrival: "0802", departure: "0803H"})该时间格式不是特…

便利的开发工具-log4cpp快速使用指南

0. 优点 提供应用程序运行上下文&#xff0c;方便跟踪调试&#xff1b; 可扩展的、多种方式记录日志&#xff0c;包括命令行、文件、回卷文件、内存、syslog服务器、Win事件日志等&#xff1b; 可以动态控制日志记录级别&#xff0c;在效率和功能中进行调整&#xff1b; 所有配…

计算机用户账户无法打开浏览器,请问怎么样禁止一个电脑用户使用IE浏览器

为了不使他人随意改变您对浏览器的设置以及对IE的某些功能限制使用&#xff0c;有必要将你的设置选项进行隐藏或禁止使用。过去在Windows 9x系统中&#xff0c;一般是通过修改注册表来实现的&#xff0c;不过这会对系统的安全性带来一定的风险。当您选择了Windows XP后&#xf…

Mask R-CNN论文理解

摘要&#xff1a; Mask RCNN可以看做是一个通用实例分割架构。Mask RCNN以Faster RCNN原型&#xff0c;增加了一个分支用于分割任务。Mask RCNN比Faster RCNN速度慢一些&#xff0c;达到了5fps。可用于人的姿态估计等其他任务&#xff1b;1、Introduction 实例分割不仅要正确的…

doctype html h5,HTML DOCTYPE

前言&#xff1a;DOCTYPE标签在平常书写HTML的时候总是放在首位内容&#xff0c;但是他有什么作用呢。正文&#xff1a;html之中的DOCTYPE书写H5与H4的时候我们引用的使用的DOCTYPE是会有些许不一样的。HTML4的时候我们使用如下格式&#xff1a;>p.s.这里我们说一下H4的几种…

servlet基础_Servlet基础

servlet基础通过本教程&#xff0c;我将尝试使您更接近Java Servlet模型。 在检查servlet规范中定义的类之前&#xff0c;我将解释在开始开发Web应用程序之前需要了解的基本知识。 了解Java Servlet模型 首先&#xff0c;不仅为基于请求和响应编程模型的规范的Web应用程序定义…