Python中常常遇到这种字符编码问题,尤其在处理网页源代码时(特别是爬虫中):

UnicodeDecodeError: ‘XXX' codec can't decode bytes in position 12-15: illegal multibyte...

以下以汉字'哈'来解释作演示样例解释全部的问题,汉字“哈”的各种编码例如以下:

1 UNICODE(UTF8-16): 0xC854

2 UTF-8: 0xE59388

3 GBK: 0xB9FE

除此之外还有如gb2312, big5等。比如一些含有繁体字的页面。比方www.google.com.hk首页中用的就是big5码,

不知道港台的码农同一时候处理简体字繁体字是不是更郁闷 :)

一直以来。python中的中文编码就是一个大问题,为他他并不能智能识别编码,而实际上其它语言也非常难做到。

在html的header里一般都能够找到字符编码比如:

当然这不是我们研究的重点,很多其它的时候是我们得知一个字符串是GBK编码, 而要用print等正确的打印出来却不easy...

首先,在python中提到unicode。一般指的是unicode对象,比如'哈哈'的unicode对象为u'\u54c8\u54c8'

而str是一个字节数组。这个字节数组表示的是对unicode对象编码后(如utf-8、gbk、cp936、GB2312)的存储的格式,这里它

仅是一个字节流。没有其他的含义,假设你想使这个字节流显示的内容有意义,就必须用正确的编码格式,解码显示。

比如:(注意是在windows下)

s = u'哈哈'

s_utf8 = s.encode('utf-8')

pirnt s_utf8

>>> 鍝堝搱

悲剧...

s_utf8这时实际上是'\xe5\x93\x88\xe5\x93\x88'

而以下的代码才干够正常显示:

s_gdb = s.encode('gbk') # s_gdk 这时是'\xb9\xfe\xb9\xfe'

print s_gbk

>>> 哈哈 #正常了

由于print语句它的实现是将要输出的内容传 送了操作系统,操作系统会依据系统的编码对输入的字节流进行编码。这就解释了

utf-8格式的字符串“哈哈”,输出的是“鍝堝搱”,由于 '\xe5\x93\x88\xe5\x93\x88'用GB2312去解释,其显示的出来就

“鍝堝搱”。

这里再强调一下,str记录的是字节数组,仅仅是某种编码的存储格式,至于输出到文件或是打印出来是什么格式。

全然取决其解码的编码将它解码成什么样子。

这里再对print进行一点补充说明:当将一个unicode对象传给print时,在内部会将该unicode对象进行一次转换,

转换成本地默认编码(这仅是个人推測)

str和unicode对象的转换,通过encode和decode实现,详细使用例如以下:再次强调windows下:

s = '哈哈'

print s.decode('gbk').encode('utf-8')

>>> 鍝堝搱

反之亦然,有兴趣能够尝试其它转换

有时当我们遇到把s(gbk字符串)直接编码成utf-8的时候。将抛出异常,可是通过调用例如以下代码:

import sys

reload(sys)

sys.setdefaultencoding('gbk')

后就能够转换成功。为什么呢?

在python中str和unicode在编码和解码过程中。假设将一个str直接编码成还有一种编码,会先把str解码成unicode,

採用默认编码,一般默认编码是anscii,所以在上面演示样例代码中第一次转换的时候会出错。

当设定当前默认编码为'gbk'后,就不会出错了。

至于reload(sys)是由于Python2.5 初始化后会删除 sys.setdefaultencoding 这种方法。我们须要又一次加载。

一般不推荐这样使用。本来reload都是应该避免使用的函数。

对于操作不同文件的编码格式的文件,也会遇到这种问题

建立一个文件test.txt,文件格式用ANSI,内容为:

abc中文

然后用python来读取

# coding=gbk

print open("Test.txt").read()

结果:abc中文

把文件格式改成UTF-8:

结果:abc涓枃,显然。这里须要解码:

# coding=gbk

import codecs

print open("Test.txt").read().decode("utf-8")

结果:abc中文

上面的test.txt我是用Editplus来编辑的。但当我用Windows自带的记事本编辑并存成UTF-8格式时,

执行时报错:

Traceback (most recent call last):

File "ChineseTest.py", line 3, in

print open("Test.txt").read().decode("utf-8")

UnicodeEncodeError: 'gbk' codec can't encode character u'\ufeff' in position 0: illegal multibyte sequence

原来,某些软件,如notepad。在保存一个以UTF-8编码的文件时,

会在文件開始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。

因此我们在读取时须要自己去掉这些字符。python中的codecs module定义了这个常量:

# coding=gbk

import codecs

data = open("Test.txt").read()

if data[:3] == codecs.BOM_UTF8:

data = data[3:]

print data.decode("utf-8")

结果:abc中文

最后,有些时候编码搞对了,可是遇到了非法字符。比方产生字符串的来源错误发生。引入了错误值等,这时再次遇到异常

比如:全角空格往往有多种不同的实现方式。比方\xa3\xa0,或者\xa4\x57,

这些字符。看起来都是全角空格。但它们并非“合法”的全角空格

真正的全角空格是\xa1\xa1,因此在转码的过程中出现了异常。

而之前在处理新浪微博数据时。遇到了非法空格问题导致无法正确解析数据。

解决的方法:

将获取的字符串strTxt做decode时。指明ignore。会忽略非法字符,

当然对于gbk等编码,处理相同问题的方法是类似的

strTest = strTxt.decode('utf-8', 'ignore')

return strTest

默认的參数就是strict,代表遇到非法字符时抛出异常;

假设设置为ignore。则会忽略非法字符;

假设设置为replace。则会用?

号代替非法字符;

假设设置为xmlcharrefreplace,则使用XML的字符引用。

其它的以后遇到再总结.....

字符编码在python中的处理_python 字符编码处理问题总结相关推荐

  1. 字符编码在python中的处理_Python 字符编码处理总结

    Python中经常遇到这样那样的字符编码问题,尤其在处理网页源码时(特别是爬虫中): UnicodeDecodeError: 'XXX' codec can't decode bytes in pos ...

  2. python中codecs模块_python自然语言编码转换模块codecs介绍

    python对多国语言的处理是支持的很好的,它可以处理现在任意编码的字符,这里深入的研究一下python对多种不同语言的处理. 有一点需要清楚的是,当python要做编码转换的时候,会借助于内部的编码 ...

  3. Computer:字符编码(ASCII编码/GBK编码/BASE64编码/UTF-8编码)的简介、案例应用(python中的编码格式及常见编码问题详解)之详细攻略

    Computer:字符编码(ASCII编码/GBK编码/BASE64编码/UTF-8编码)的简介.案例应用(python中的编码格式及常见编码问题详解)之详细攻略 目录 符串编码(ASCII编码/GB ...

  4. python中空位符_python中空位符_Python之路 - Python - 字符编码 - 期权论坛

    字符编码 python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill) ASCII(American Standard Code for Information Interc ...

  5. Python中的字符串与字符编码:编码和转换问题

    原文转载自:http://www.cnblogs.com/yyds/p/6171340.html 读后感:最近在跑实验,对于中文编码问题一直感到困扰,读完这篇文章以后,了解了Unicode编码的一些信 ...

  6. python中len 函数_python len

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 在python中除了print函数之外,len函数和type函数应该算是使用最频 ...

  7. Python中Unicode字符串(字符串编码问题)

    Python中Unicode字符串(字符串编码问题) 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以 ...

  8. 编码以及Python中的编码

    编码 不管是哪种语言,在学习的时候,只要涉及到中文,多多少少都会遇到一些编码问题.然而,说实话,作为一个英语水平没有那么专业的中国人,中文是必不可少的.所以,了解编码以及解码就变得非常重要.下面是从各 ...

  9. python中空格属于字符吗_举例说明python中空格是属于字符

    python中空格属于字符吗? 答案是肯定的,空格在Python中也是属于字符的. 案例: 输入一行字符,分别统计出其中英文字母.空格.数字和其它字符的个数.#!/usr/bin/python # - ...

最新文章

  1. 报告 | 2017年云商业智能市场分析:云计算比大数据更重要
  2. 李战:悟透JavaScript 【转】
  3. boost::hana::remove_at_c用法的测试程序
  4. oracle / parallle /,Oracle海量数据迁移之使用shell启用多个动态并行
  5. 尝试读取或写入受保护的内存 这通常指示_CPU到底有多快?内存:是我的250倍...
  6. 随手小记:都是反着的
  7. debian下使用dpkg来安装/卸载deb包 (转载)
  8. Adapter(适配)
  9. php 递归函数 示例,php 递归函数用法示例
  10. 读书笔记:《金字塔原理》
  11. HTML5气泡悬浮框(已经加上完整文件)
  12. ios点击推送闪退_iphone闪退是什么原因?
  13. 新书上市|豆瓣8.6,首部全面披露中国游戏发展史的奇书!
  14. 用for循环打印乘法口诀表
  15. 黑客每小时发送3万封性勒索邮件:轻松月入11万!
  16. 双ISP出口网络组网
  17. 水果手机 Safari transform rotateY 不兼容问题
  18. 中心睿典计算机考试题,广西百色中星睿典职称计算机考试:wpsOffice判断题练习题及答案...
  19. 二.ffmpeg 编译和配置
  20. AutoJs4.1.0实战教程---js文件打包发布成APK文件

热门文章

  1. jtopo绘图帧数与cpu使用率
  2. vscode ---- 插件
  3. java获取access token_【Java示例】如何获取AccessToken
  4. java.net.URISyntaxException: Illegal character in query at index,http请求url中有非法字符导致
  5. windows中启动 java -jar 后台运行程序
  6. SpringBoot注解@Value取值取不到问题
  7. vue中element-ui table滚动加载
  8. Android开发笔记(一百五十六)通过渲染纹理展示地球仪
  9. Android开发笔记(八十七)几个修饰关键字
  10. vue2.x-cnode(vue全家桶)