将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