#如何处理中文编码的问题

python的UnicodeDecodeError: ‘utf8’ codec can’t decode byte 0xxx in position
这个错误是因为你代码中的某个字符串使用了费ascii编码的字符,也就是它代表的16进制的编码超过127。
解决这个问题可以使用下面的方法解决,其实就是设置默认的编码。python 2.x的默认编码是ascii,如果改为utf-8,就可以了。

import sys
reload( sys )
sys.setdefaultencoding('utf-8')

其实从python 3.0以后默认就用utf-8,就没有这个问题了。

新手写pyhton程序经常遇到编码问题,其实是对py的编码不熟悉,经常范小毛病,郁闷好久。。。
今天终于搞懂的py的编码。

  1. pyhton的所有内置库、方法接受的是unicode编码的字符串。
  2. str.decode 函数就是转成unicode编码,所以能decode的字符串传级python的内置库、函数都能正确运行。
    3.问题在于这个decode函数解码时到底要传哪个参数:utf-8,gbk,gb2312…等N种编码。参数不当,就会抛类似异常:
    UnicodeDecodeError: ‘gbk’ codec can’t decode bytes in position 2-3: illegal multibyte sequence
    UnicodeDecodeError: ‘utf8’ codec can’t decode bytes in position 0-1: invalid data
    下面举个例子:
#coding:utf-8
#指定本文件编码为utf8
import os
# 以下为示例代码,不一定能运行。随意写的,无编译运行过。
# 例子以XP平台为例,因为linux平台编码(UTF-8)与window平台(GBK)不一样。
# 假设D盘下面有很多中文名称文件
filelist = os.listdir(r"d:\\") # 此处返回的list中的中文是以GBK编码的,你可以通过查看cmd窗口属性看到。
for path in filelist:  if os.path.isdir(path): continue  fp = open(path.decode("GBK") , 'rb')  # 如果此处用 path.decode("UTF-8") 就会抛异常,原因是wind的dir命令返回的是GBK编码  print len(fp.read())  fp.close()
filepath =r"d:\\中文文件.doc"             # 假设此文存在,记得要带中文
fp = open(filepath.decode('utf-8'), "rb") #这里使用utf8参数进行解码,原因是文件头里有句coding: utf-8
print len(fp.read())
fp.close()
path2 = u"d:\\中文文件.doc"  # 假如这里有个u在前面,这个变量就是unicode编码了,不用解码。
fp = open(path2, 'rb')
print len(fp.read())
fp.close()

为什么Python使用过程中会出现各式各样的乱码问题,明明是中文字符却显示成“\xe4\xb8\xad\xe6\x96\x87”的形式?
为什么会报错“UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-1: ordinal not in range(128)”?本文就来研究一下这个问题。
字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。
decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode(‘gb2312’),表示将gb2312编码的字符串str1转换成unicode编码。
encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode(‘gb2312’),表示将unicode编码的字符串str2转换成gb2312编码。
因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码
代码中字符串的默认编码与代码文件本身的编码一致。
如:s=‘中文’
如果是在utf8的文件中,该字符串就是utf8编码,如果是在gb2312的文件中,则其编码为gb2312。这种情况下,要进行编码转换,都需要先用decode方法将其转换成unicode编码,再使用encode方法将其转换成其他编码。通常,在没有指定特定的编码方式时,都是使用的系统默认编码创建的代码文件。
如果字符串是这样定义:s=u’中文’
则该字符串的编码就被指定为unicode了,即python的内部编码,而与代码文件本身的编码无关。因此,对于这种情况做编码转换,只需要直接使用encode方法将其转换成指定编码即可。
如果一个字符串已经是unicode了,再进行解码则将出错,因此通常要对其编码方式是否为unicode进行判断:
isinstance(s, unicode) #用来判断是否为unicode
用非unicode编码形式的str来encode会报错
如何获得系统的默认编码?

#!/usr/bin/env python
#coding=utf-8
import sys
print sys.getdefaultencoding()

该段程序在英文WindowsXP上输出为:ascii
在某些IDE中,字符串的输出总是出现乱码,甚至错误,其实是由于IDE的结果输出控制台自身不能显示字符串的编码,而不是程序本身的问题。
如在UliPad中运行如下代码:

s=u"中文"
print s

会提示:UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-1: ordinal not in range(128)。这是因为UliPad在英文WindowsXP上的控制台信息输出窗口是按照ascii编码输出的(英文系统的默认编码是ascii),而上面代码中的字符串是Unicode编码的,所以输出时产生了错误。
将最后一句改为:

print s.encode('gb2312')

则能正确输出“中文”两个字。
若最后一句改为:

print s.encode('utf8')

则输出:\xe4\xb8\xad\xe6\x96\x87,这是控制台信息输出窗口按照ascii编码输出utf8编码的字符串的结果。
unicode(str,‘gb2312’)与str.decode(‘gb2312’)是一样的,都是将gb2312编码的str转为unicode编码
使用str.__class__可以查看str的编码形式
原理说了半天,最后来个包治百病的吧:)

#!/usr/bin/env python
#coding=utf-8
s="中文" if isinstance(s, unicode):
#s=u"中文"
print s.encode('gb2312')
else:
#s="中文"
print s.decode('utf-8').encode('gb2312')

#如何判断字符str的编码是什么?

使用 chardet 可以很方便的实现字符串/文件的编码检测。尤其是中文网页,有的页面使用GBK/GB2312,有的使用UTF8,如果你需要去爬一些页面,知道网页编码很重要的,虽然HTML页面有charset标签,但是有些时候是不对的。那么chardet就能帮我们大忙了。

chardet实例

 import urllibrawdata = urllib.urlopen('http://www.google.cn/').read()import chardetchardet.detect(rawdata)
{'confidence': 0.98999999999999999, 'encoding': 'GB2312'}

chardet可以直接用detect函数来检测所给字符的编码。函数返回值为字典,有2个元数,一个是检测的可信度,另外一个就是检测到的编码。

chardet 安装

下载chardet后,解压chardet压缩包,直接将chardet文件夹放在应用程序目录下,就可以使用import chardet开始使用chardet了。

或者使用setup.py安装文件,将chardet拷贝到Python系统目录下,这样你所有的python程序只要用import chardet就可以了。

python setup.py install

#总结

尽量把所有的input 都decode成unicode。即 str.decode(‘utf-8’);

输出时,再encode成所需的编码格式

decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode(‘gb2312’),表示将gb2312编码的字符串str1转换成unicode编码。
encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode(‘gb2312’),表示将unicode编码的字符串str2转换成gb2312编码。


#ref:
原文地址

也谈 Python 的中文编码处理

PYTHON-进阶-编码处理小结

http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

Python中文编码与Unicode

判断字符的编码

python处理中文编码问题总结相关推荐

  1. [Python爬虫] 中文编码问题:raw_input输入、文件读取、变量比较等str、unicode、utf-8转换问题

    最近研究搜索引擎.知识图谱和Python爬虫比较多,中文乱码问题再次浮现于眼前.虽然市面上讲述中文编码问题的文章数不胜数,同时以前我也讲述过PHP处理数据库服务器中文乱码问题,但是此处还是准备简单做下 ...

  2. 简单解决Python文件中文编码问题

    这篇文章主要介绍了简单解决Python文件中文编码问题的相关资料,需要的朋友可以参考下 读写中文 需要读取utf-8编码的中文文件,先利用sublime text软件将它改成无DOM的编码,然后用以下 ...

  3. [Python爬虫] 中文编码问题:raw_input输入、文件读取、变量比较等str、unicode、utf-8转换问题...

            最近研究搜索引擎.知识图谱和Python爬虫比较多,中文乱码问题再次浮现于眼前.虽然市面上讲述中文编码问题的文章数不胜数,同时以前我也讲述过PHP处理数据库服务器中文乱码问题,但是此处 ...

  4. python怎么判断是不是汉字危机_谈 Python 的中文编码处理

    最近业务中需要用 Python 写一些脚本.尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息. 很快,我就遇到了异常: Python代码   UnicodeE ...

  5. python中文编码-彻底弄懂python编码

    在编写python程序的过程中,中英文混用经常会出现编码问题.围绕此问题,本文首先介绍编码的含义及常用编码,随后列举几个python经常遇到的编码异常及解决方法,接着列举笔者在实践中遇到的异常出现的情 ...

  6. python中文编码与处理详解(个人认为比较全面详细了)

    注意:本文只是针对 python 2,在 python 3 中,编码方式与处理技巧有些许变化,具体请参考: Python 2 与 Python 3 的差异对比: http://my.oschina.n ...

  7. [Python] 中文编码问题:raw_input输入、文件读取、变量比较等str、unicode、utf-8转换问题

    最近研究搜索引擎.知识图谱和Python爬虫比较多,中文乱码问题再次浮现于眼前.虽然市面上讲述中文编码问题的文章数不胜数,同时以前我也讲述过PHP处理数据库服务器中文乱码问题,但是此处还是准备简单做下 ...

  8. [Python] 中文编码问题:raw_input输入、文件读取、变量比较等str、unicode、utf-8转换问题...

    最近研究搜索引擎.知识图谱和Python爬虫比较多,中文乱码问题再次浮现于眼前.虽然市面上讲述中文编码问题的文章数不胜数,同时以前我也讲述过PHP处理数据库服务器中文乱码问题,但是此处还是准备简单做下 ...

  9. python 汉字编码_python对于中文编码处理的几种方式

    我们在编写程序或者脚本的时候,会遇到"中文"编码的问题,导致整个程序无法正常运行,古整理了目前知道的所有"python对于中文编码处理的几种方式",具体如下:# ...

最新文章

  1. 网站SEO文章关键词布局优化的技巧指南
  2. 一个类型初始值设定项引发异常
  3. AD 批量修改漫游文件
  4. CodeForces - 1463E Plan of Lectures(拓扑排序+并查集缩点)
  5. TestNG中的参数化– DataProvider和TestNG XML(带有示例)
  6. 南岸焊接机器人厂_严选原料,机器人焊接,探秘能达到奔驰标准的亿利生产线...
  7. 【图像匹配】【词袋算法】词袋算法应用图像匹配
  8. Chrome历史版本以及ChromeDriver下载地址对应的版本
  9. unity3d 本地化数据PlayerPrefs详解
  10. 偶然发现的写参考文献的利器(超快搜索+快捷摘要总结)、文末再讲一下EndNote的使用心得
  11. 人工智能导论(数据挖掘)
  12. 三、Sails 中使用Jwt进行身份认证
  13. 可惜我是水瓶座 你不懂的水瓶座,不为人知的秘密
  14. Android10的WIFI 名称读取为空解决
  15. xctf 攻防世界 MISC
  16. micro入门指南——核心功能介绍
  17. 关于一个ISE错误XST:899的错误判断的讨论
  18. HP DL380 G9 配置RAID
  19. Oculus Quest 2接华硕路由器激活全流程
  20. Struts2的s标签库使用方式

热门文章

  1. java编程窗口在哪里下载_EeJava下载
  2. 升级win11系统需要预留多少磁盘空间 Windows11系统盘需要多少空间的介绍
  3. win11更新特别慢怎么办 windows11更新缓慢的解决方法
  4. pip源使用国内镜像
  5. POI报表入门,excel,使用事件模型解析百万数据excel报表
  6. 通过拦截器获取控制类requestMapping注解中的属性值
  7. mybatis多种方式注册映射文件
  8. excel 单元格文本链接方法
  9. mysql 权限管理无效_mysql 权限控制笔记
  10. 3D移动translate3d(CSS3)