python中文编码问题 python判断与处理编码的方法

发布时间:2019-10-20编辑:脚本学堂
有关python中文编码的问题,在python编程中正确处理编码,尤其是中文编码的问题,有时需要些技巧,本文通过实例分析了python编码及中文编码的设置与处理方法。

一、python中文编码问题

当字符串是:'u4e2du56fd'
 

>>>s=['u4e2du56fd','u6e05u534eu5927u5b66']
>>>str=s[0].decode('unicode_escape') #.encode("EUC_KR")
>>>print str
中国

当字符串是:' 东亚学团一中'
 

>>>print unichr(19996)

ord()支持unicode,可以显示特定字符的unicode号码,如:
 

>>>print ord('A')
65
 

只要和Unicode连接,就会产生Unicode字串。如:
 

>>> 'help'
'help'
>>> 'help,' + u'python' 
u'help,python'

对于ASCII(7位)兼容的字串,可和内置的str()函数把Unicode字串转换成ASCII字串。如:
 

>>> str(u'hello world')
'hello world'


对几个概念的理解:
ASCII码 用数据字 对应 相应的字符 如下图所示:
python中文编码问题

而中文 就是区位码对应汉字。如:“好” 的ASCII码为: 22909
 
unicode 编码 每个国家分一块。它有UTF-8、UTF-16、UTF-32等形式
中文范围 4E00-9FBF:这个范围内有 gbk,gb2312,
 
utf-8是基于unicode的 国际化的场合适合使用
gb2312和gb2312都是国标码 出现的较早 主要用于编解码常用汉字。

----------------------------------------

首先,要明白encode()和decode()的区别
encode()的作用是将Unicode编码的字符串转换为其他编码格式。

例如:
st1.encode("utf-8")  这句话的作用是将Unicode编码的st1编码为utf-8编码的字符串
decode()的作用是把其他编码格式的字符串转换成Unicode编码的字符串。

例如:
st2.decode("utf-8") 这句话的作用是将utf-8编码的字符串st2解码为Unicode编码的字符串
第二,除Unicode编码的字符串以外,任何一种编码的字符串要想转换为其他编码格式,必须先解码后编码
非Unicode编码--> Unicode编码-->非Unicode编码

例如,utf-8编码的字符串st想要转换为gbk编码的字符串,必须经过以下步骤:
 

st=st.decode("utf-8") #解码为Unicode编码
st=st.encode("gbk")  #从Unicode编码编码为gbk编码

第三,经常使用的utf-8编码还分为有BOM的和无BOM的。

第四:关于json文件的中文编码。用Python读取Json文件时经常用到json.load()函数,该函数对json文件的格式是有要求的
1)json文件是utf-8 without BOM编码的,那么可以直接用json.load(filename)函数读取json文件的内容
2)json文件是utf-8 with BOM编码的,不能用json.load()函数读取,json.load()不能正确识别
3)json文件时其他编码的,比如gbk, 要把json文件的编码格式作为一个参数传给json.load():
eg. json.load(filename,"gbk")
第五,怎么查看并且设置自己文件的编码呢?
介绍一个个人比较喜欢的工具"Nodtepad++",随便一个软件管家里就与一键安装。
用这个工具你可以方便的查看自己的文件的当前编码,并可以轻松转换成任意其他编码格式

---------------

二、python处理中文编码和判断编码的方法

在开发自用爬虫过程中,有的网页是utf-8,有的是gb2312,有的是gbk,如果不加处理,采集到的都是乱码,解决方法是将html处理成统一的utf-8编码

针对python2.7
 

复制代码 代码示例:

#coding:utf-8
#chardet 需要下载安装
import chardet
#抓取网页html
line = "http://www.***.com"
html_1 = urllib2.urlopen(line,timeout=120).read()
#print html_1
encoding_dict = chardet.detect(html_1)
#print encoding
web_encoding = encoding_dict['encoding']
if web_encoding == 'utf-8' or web_encoding == 'UTF-8':

  html = html_1
else :
   html = html_1.decode('gbk','ignore').encode('utf-8')
#有以上处理,整个html就不会是乱码。