股票杠杆开户:rfc atpython2.x中处理中文,是一件头疼的事情。网上写这方面的文章,测次不齐,而且都会有点错误,所以在这里打算自己总结一篇文章。这里假设读者已有与编码相关的基础知识
<炒股杠杆平台>Python2.x处理中文常出错?看str编码流程及默认编码原因炒股杠杆平台>
# -*- coding:utf-8 -*- su = "人生苦短" # : su是一个utf-8格式的字节串 u = s.decode("utf-8") # : s被解码为unicode对象,赋给u sg = u.encode("gbk") # : u被编码为gbk格式的字节串,赋给sg print sg # 打印sg
但是事实情况要比这个复杂,比如看如下代码:
s = "人生苦短" s.encode('gbk')
看!str也能编码,(事实上对象也能解码,但是意义不大)
这样为什么可以?看上图的编码流程的箭头,你就能想到原理,当对str进行编码时,会先用默认编码将自己解码为,然后在将编码为你指定编码。
这就引出了.x中在处理中文时,大多数出现错误的原因所在:的默认编码,是ascii
看这个例子:
# -*- coding: utf-8 -*- s = "人生苦短" s.encode('gbk')
上面的代码会报错,错误信息:: ‘ascii' codec can't byte ……
因为你没有指定,所以它其实在做这样的事情:
# -*- coding: utf-8 -*- s = "人生苦短" s.decode('ascii').encode('gbk')
设置
设置的代码如下:
reload(sys) sys.setdefaultencoding('utf-8')
如果你在中进行编码和解码的时候,不指定编码方式,那么就会使用。
比如上一节例子中将str编码为另一种格式,就会使用。
s.encode("utf-8") 等价于 s.decode(defaultencoding).encode("utf-8")
再比如你使用str创建对象时,如果不说明这个str的编码格式,那么程序也会使用。
u = unicode("人生苦短") 等价于 u = unicode("人生苦短",defaultencoding)
默认的:ascii是许多错误的原因,所以早早的设置是一个好习惯。
文件头声明编码的作用。
这要感谢这篇博客关于文件头部分知识的讲解。
顶部的:# -*- : utf-8 -*-目前看来有三个作用。
如果代码中有中文注释,就需要此声明
比较高级的编辑器(比如我的emacs),会根据头部声明,将此作为代码文件的格式。
程序会通过头部声明,解码初始化 u”人生苦短”,这样的对象,(所以头部声明和代码的存储格式要一致)
关于库
是一个很实用的 HTTP客户端库,编写爬虫和测试服务器响应数据时经常会用到。
其中的对象在访问服务器后会返回一个对象,这个对象将返回的Http响应字节码保存到属性中。
但是如果你访问另一个属性text时,会返回一个对象,乱码问题就会常常发成在这里。
因为对象会通过另一个属性来将字节码编码成,而这个属性居然是自己猜出来的。
官方文档:
text
of the , in .
If . is None, will be using .
The of the is based on HTTP , RFC 2616 to the . If you can take of non-HTTP to make a guess at the , you set r. this .
所以要么你直接使用(字节码),要么记得把设置正确,比如我获取了一段gbk编码的网页,就需要以下方法才能得到正确的。
import requests url = "http://xxx.xxx.xxx" response = requests.get(url) response.encoding = 'gbk' print response.text
不仅仅要原理,更要使用方法!
如果是早期的我写博客,那么我一定会写这样的例子:
如果现在的文件编码为gbk,然后文件头为:# -*- : utf-8 -*-,再将默认编码设置为xxx,那么如下程序的结果会是……
这就类似于,当年学c的时候,用各种优先级Python2.x处理中文常出错?看str编码流程及默认编码原因,结合性,指针来展示自己水平的代码。
实际上这些根本就不实用,谁会在真正的工作中写这样的代码呢?我在这里想谈谈实用的处理中文的方法。
基本设置
主动设置。(默认的是ascii)
代码文件的保存格式要与文件头部的# :xxx一致
如果是中文,程序内部尽量使用rfc at,而不用str
关于打印
你在打印str的时候,实际就是直接将字节流发送给shell。如果你的字节流编码格式与shell的编码格式不相同,就会乱码。
而你在打印的时候,系统自动将其编码为shell的编码格式,是不会出现乱码的。
程序内外要统一
如果说程序内部要保证只用,那么在从外部读如字节流的时候,一定要将这些字节流转化为,在后面的代码中去处理,而不是str。
with open("test") as f: for i in f: # 将读入的utf-8字节流进行解码 u = i.decode('utf-8') ....
如果把连接程序内外的这段数据流比喻成通道的的话,那么与其将通道开为字节流,读入后进行解码,不如直接将通道开为的。
# 使用codecs直接开unicode通道 file = codecs.open("test", "r", "utf-8") for i in file: print type(i) # i的类型是unicode的
所以处理中文编码问题的关键是你要清晰的明白,自己在干什么,打算读入什么格式的编码,声明的的这些字节是什么格式的,str到是如何转换的,str的一种编码到另一种编码又是如何进行的。 还有,你不能把问题变得混乱,要自己主动去维护一种统一。
本文的版权归属于[炒股杠杆平台]。未经许可,任何个人或机构不得擅自复制、传播、修改或用于商业用途。本文链接:http://tyjjkj.com/html/gupiaoganggankaihu/905.html