Python2 编码问题实用解决方法

原创
2017/03/22 10:30
阅读数 998

将python2中汉字会出现乱码的事一次性说清楚。
为了让初学者,不再为python2中汉字出现乱码的事烦恼!


1、写的代码模块需要指定编码
如果代码没有指定coding,python就默认所有的字符为ASCII码,
ASCII码只支持256个字符,ASCII码不支持中文,所以就报错。
所以要在代码前写上#coding:utf-8或#coding:gbk
但通用写上#coding:utf-8

2、python2 内部所有编码统一为unicode
unicode可以处理世界上所有语言的字符。
utf-8为unicode的一种实现形式,所以需要在代码前写上#coding:utf-8

3、编码转换
牢记python2内部编码为unicode.
其它的编码decode()为unicode,再编码encode()为你指定的编码,就不会出现乱码。

4、网页采集时
代码指定#coding:utf-8
如果网页的编码为gbk
需要这样处理:
html = html.decode('gbk').encode('utf-8')

5、代码前也可以写#coding:gbk,但也要保证你的代码文件的保存格式为gbk.这个在windows下会出现这样的问题。

6、字典等key或值的汉字问题
这里在IDE的设置里面指定IDE的默认编码 encoding为utf-8

# -*- coding:utf-8 -*-
#Author:zzk
import sys
print sys.getdefaultencoding()
# ascii
s = "中文"
print s
# 中文

if isinstance(s, unicode):
# s=u"中文"
    print s.encode('gb2312')
else:
# s="中文"
    print s.decode('utf-8').encode('utf-8')
# 中文

dict1 ={1:'python学习',2:'需要阅读的资料12345'}
print dict1
# 这样输出的没有显示汉字,是显示汉字的其它编码
dict2 ={1:'python学习',2:'需要阅读的资料12345'}
for key in dict2:
    print dict2[key]
# {1: 'python\xe5\xad\xa6\xe4\xb9\xa0', 2: '\xe9\x9c\x80\xe8\xa6\x81\xe9\x98\x85\xe8\xaf\xbb\xe7\x9a\x84\xe8\xb5\x84\xe6\x96\x9912345'}
# python学习
# 需要阅读的资料12345

可以看出,使用把字典的内容遍历一个个输出时,就没有问题

7、unicode的汉字编码写到文本文件中
需要根据文本文件的编码进行转换
可以encode('utf-8')或encode('gbk')

总结:凡是报错信息中出现的错误包含“ASCII”,就是没有指定汉字编码的问题。

自己的实践案例:

# -*- coding:utf-8 -*-
__author__ = 'ZHONGZHIKUN408'
import urllib2
import re

url ='http://www.csdn.net/'
req = urllib2.Request(url)

response = urllib2.urlopen(url)
content = response.read()

pattern1 = re.compile(r'<li><a title="(.*?)"\shref="(.*?)"')
data = re.findall(pattern1,str(content).decode('utf-8').encode('utf-8'))
print data
#这里直接打印,还是出现问题,因为输出是一个字典加上元组
j = 1
for i in data:
    title = i[0]
    print "Title %d is %s" %(j,title)
    url = i[1]
    print "URL %d is %s" %(j,url)
    j+=1
    with open('retest.txt','a') as f:
        f.writelines(title.decode('utf-8').encode('utf-8')+'\n')
        #开始写入文本的时候,也是unicode编码的,加上decode().encode()后,才正常
        # f.write('\n')   #有方法实现写入的时候换行,如上
        f.write(url)
        f.write('\n')

输出结果: 

[('\xe4\xbb\x8e\xe9\x9b\xb6\xe6\x89\x93\xe9\x80\xa0\xe6\x90\xba\xe7\xa8\x8b\xe6\x97\xa0\xe7\xba\xbf\xe6\x8c\x81\xe7\xbb\xad\xe4\xba\xa4\xe4\xbb\x98\xe5\xb9\xb3\xe5\x8f\xb0 MCD \xe5\xae\x9e\xe8\xb7\xb5', 'http://geek.csdn.net/news/detail/188103'), ('\xe6\x8e\xa2\xe8\xae\xa8\xe6\x95\xb0\xe6\x8d\xae\xe6\x97\xb6\xe4\xbb\xa3\xe6\x9e\x84\xe5\xbb\xba\xe9\xab\x98\xe5\x8f\xaf\xe7\x94\xa8\xe6\x95\xb0\xe6\x8d\xae\xe5\xba\x93\xe7\x9a\x84\xe6\x96\xb0\xe6\x8a\x80\xe6\x9c\xaf', 'http://geek.csdn.net/news/detail/187852')]

Title 1 is 从零打造携程无线持续交付平台 MCD 实践
URL 1 is http://geek.csdn.net/news/detail/188103
Title 2 is 探讨数据时代构建高可用数据库的新技术
URL 2 is http://geek.csdn.net/news/detail/187852

 

 

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部