python 中文乱码问题
来源:互联网 发布:淘宝windows10激活码 编辑:程序博客网 时间:2024/04/28 05:24
你要是碰到该问题了,并且google了,那么估计你已经快无奈了。希望下面的说明对你有用。
本文主要说明如何从网站获取页面,并且如何查找页面中的中文字符。实验中的平台为Python 2.7 。
python2.7 太直接了,操作系统给它什么格式编码的字符串,它就接收啥格式的字符串,默认的格式与你使用的格式不同,因此,各种错误出现了。
解决方法:
1.知道系统所使用的编码格式
2.把获取的页面先用系统格式解码,然后在编码为utf8格式
3.你的脚本中统一使用uft8编码
4.处理结束,把你的字符串先utf8解码,然后系统格式编码。
流程结束
- # -*- coding: utf-8 -*-
- import sys
- import urllib2
- # 获得系统默认编码格式
- sysCharType = sys.getfilesystemencoding()
- # 获取页面
- headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
- req = urllib2.Request("http://www.baidu.com/", headers=headers)
- html = urllib2.urlopen(req).read()
- sysHtml = html.decode(sysCharType).encode('utf-8')
- s = '百度一下,你就知道'
- if html.find(s)!= -1:
- print '未经转化 字符匹配'
- else:
- print '未经转化 字符不匹配'
- if sysHtml.find(s)!= -1:
- print '经过转化 字符匹配'
- else:
- print '经过转化 字符不匹配'
另,看了kiki113的文章后,大有收获。kiki113的原始帖子地址。
str为字节数组,它仅仅是一个字节流,没有其它的含义。而unicode是一种编码格式。我们可以把具有unicode编码格式的字符串看做字节流,但是不能把随意一个字节流当做unicode字符串解释。这就是在进行字符编码转化中经常发生问题的直接原因。
在python中,如果将一个str直接编码成另一种编码例如UTF-8,则系统先把str解码成unicode,然后把unicode编码格式转化为目标格式(UTF-8),而从str到unicode过程中,系统认为str为默认编码格式,一般认为是ASCII,如果原始编码不是ASCII则会发生错误。
下面来看几个例子
1.查看默认编码格式
- >>> import sys
- >>> sys.getdefaultencoding()
- 'ascii'
- >>> s = '您好'
- >>> s
- '\xc4\xfa\xba\xc3' #这是GBK编码格式的字节流
- >>> s1=u'您好'
- >>> s1
- u'\xc4\xfa\xba\xc3'# 这个吗,看看对象类型。u的意义是声明它后面跟随的字符串是unicode格式编码,如果不是,则会出错。
- <type 'str'>
- >>> type(s1)
- <type 'unicode'> #s1是unicode类型的,但是里面的内容是GBK格式的
转化到utf-8格式
- >>> su = s.encode('utf-8')
- Traceback (most recent call last):
- File "<pyshell#9>", line 1, in <module>
- su = s.encode('utf-8')
- UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128)
- 直接转化发生错误
- >>> su = s.decode('gbk').encode('utf-8')
- >>> su
- '\xe6\x82\xa8\xe5\xa5\xbd'
- >>> print su
- 鎮ㄥソ
- >>> sun = su.decode('utf-8')
- >>> sun
- u'\u60a8\u597d'
- >>> print sun
- 您好
- >>> s.decode('gbk')
- u'\u60a8\u597d'
- <span>s1.decode('gbk')</span>
- Traceback (most recent call last): File "<pyshell#17>", line 1, in <module> s1.decode('gbk')UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3: ordinal not in range(128)
可见,采用不同的编码格式,看起来一样的字符,其存储格式是不同的。编码声明就是显式的说明文件中的字符编码格式,并且告知系统,后面遇到的字符,全按照声明的格式去解释。例如脚本文件
- s = '您好'
- print repr(s)
a.如果文件格式为utf-8,则str的值为:'\xe6\x82\xa8\xe5\xa5\xbd'
b.如果文件格式为ASCII,则str的值为:'\xc4\xfa\xba\xc3'
如果编码格式和声明不相符合呢?
文件为UTF-8格式保存,声明为GBK
- # -*- coding: GBK -*-
- s = '您好'
- print repr(s)
- print s
- '\xe6\x82\xa8\xe5\xa5\xbd'
- 鎮ㄥソ
文件为ASCII,声明为UTF-8(我们知道文件会被保存为GBK格式)
- '\xc4\xfa\xba\xc3'
- 您好
文件为UTF-8格式保存,声明为GBK
- # -*- coding: GBK -*-
- s = u'您好'
- print repr(s)
- print s
- u'\u93ae\u3125\u30bd'
- 鎮ㄥソ
为什么会这样?在运行ss = u'您好'的时候,整个过程可分为以下几步:
1) 获取'您好'的编码:由文件编码格式确定,为‘\xe6\x82\xa8\xe5\xa5\xbd’
2) 转成unicode编码的时候,根据文件的显示编码格式声明对'\xe6\x82\xa8\xe5\xa5\xbd'解码,不是用utf-8解码,而是用声明编码处指定的编码GBK解码,得到字符串‘鎮ㄥソ’',这三个字的unicode编码就是u'/u93ae/u3125/u30bd',因此 print repr(ss)输出的是/u93ae/u3125/u30bd。
- python中文乱码问题
- python中文乱码问题
- python中文乱码问题
- python 中文乱码问题
- python 中文乱码问题
- 【python】中文乱码问题
- Python 中文乱码问题
- python 中文乱码问题
- python中文乱码问题
- python 中文乱码问题
- python 中文乱码问题
- python 中文乱码问题
- python中文乱码问题
- Python中文乱码问题
- python 中文乱码问题
- Python 中文乱码问题
- python中文乱码的问题
- python编程--中文乱码问题
- UItraEdit许可证密钥
- 判断页面是否真的关闭和刷新方法
- ViewPager 详解(三)---PagerTabStrip与PagerTitleStrip添加标题栏的异同
- 344. Reverse String
- 打造一个尖端的团队,需要集众人的力量
- python 中文乱码问题
- 解读(二):从简单的类开始
- ubuntu14.04 安装配置JDK
- 使用sed替换替换指定行的日期部分
- C++ 标准库string类
- 确保一个程序只存在一个实例运行
- C++ 按行读取文件并按空格将数据存储为vector
- WIN10 使用Aventail VPN Connection无法连接公司VPN
- C# 字符串中判断存在的几种模式和效率(string.contains、string.IndexOf、Regex.Match)