字符编码在python中的处理_python 字符编码处理问题总结
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 字符编码处理问题总结相关推荐
- 字符编码在python中的处理_Python 字符编码处理总结
Python中经常遇到这样那样的字符编码问题,尤其在处理网页源码时(特别是爬虫中): UnicodeDecodeError: 'XXX' codec can't decode bytes in pos ...
- python中codecs模块_python自然语言编码转换模块codecs介绍
python对多国语言的处理是支持的很好的,它可以处理现在任意编码的字符,这里深入的研究一下python对多种不同语言的处理. 有一点需要清楚的是,当python要做编码转换的时候,会借助于内部的编码 ...
- Computer:字符编码(ASCII编码/GBK编码/BASE64编码/UTF-8编码)的简介、案例应用(python中的编码格式及常见编码问题详解)之详细攻略
Computer:字符编码(ASCII编码/GBK编码/BASE64编码/UTF-8编码)的简介.案例应用(python中的编码格式及常见编码问题详解)之详细攻略 目录 符串编码(ASCII编码/GB ...
- python中空位符_python中空位符_Python之路 - Python - 字符编码 - 期权论坛
字符编码 python解释器在加载 .py 文件中的代码时,会对内容进行编码(默认ascill) ASCII(American Standard Code for Information Interc ...
- Python中的字符串与字符编码:编码和转换问题
原文转载自:http://www.cnblogs.com/yyds/p/6171340.html 读后感:最近在跑实验,对于中文编码问题一直感到困扰,读完这篇文章以后,了解了Unicode编码的一些信 ...
- python中len 函数_python len
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 在python中除了print函数之外,len函数和type函数应该算是使用最频 ...
- Python中Unicode字符串(字符串编码问题)
Python中Unicode字符串(字符串编码问题) 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以 ...
- 编码以及Python中的编码
编码 不管是哪种语言,在学习的时候,只要涉及到中文,多多少少都会遇到一些编码问题.然而,说实话,作为一个英语水平没有那么专业的中国人,中文是必不可少的.所以,了解编码以及解码就变得非常重要.下面是从各 ...
- python中空格属于字符吗_举例说明python中空格是属于字符
python中空格属于字符吗? 答案是肯定的,空格在Python中也是属于字符的. 案例: 输入一行字符,分别统计出其中英文字母.空格.数字和其它字符的个数.#!/usr/bin/python # - ...
最新文章
- 报告 | 2017年云商业智能市场分析:云计算比大数据更重要
- 李战:悟透JavaScript 【转】
- boost::hana::remove_at_c用法的测试程序
- oracle / parallle /,Oracle海量数据迁移之使用shell启用多个动态并行
- 尝试读取或写入受保护的内存 这通常指示_CPU到底有多快?内存:是我的250倍...
- 随手小记:都是反着的
- debian下使用dpkg来安装/卸载deb包 (转载)
- Adapter(适配)
- php 递归函数 示例,php 递归函数用法示例
- 读书笔记:《金字塔原理》
- HTML5气泡悬浮框(已经加上完整文件)
- ios点击推送闪退_iphone闪退是什么原因?
- 新书上市|豆瓣8.6,首部全面披露中国游戏发展史的奇书!
- 用for循环打印乘法口诀表
- 黑客每小时发送3万封性勒索邮件:轻松月入11万!
- 双ISP出口网络组网
- 水果手机 Safari transform rotateY 不兼容问题
- 中心睿典计算机考试题,广西百色中星睿典职称计算机考试:wpsOffice判断题练习题及答案...
- 二.ffmpeg 编译和配置
- AutoJs4.1.0实战教程---js文件打包发布成APK文件
热门文章
- jtopo绘图帧数与cpu使用率
- vscode ---- 插件
- java获取access token_【Java示例】如何获取AccessToken
- java.net.URISyntaxException: Illegal character in query at index,http请求url中有非法字符导致
- windows中启动 java -jar 后台运行程序
- SpringBoot注解@Value取值取不到问题
- vue中element-ui table滚动加载
- Android开发笔记(一百五十六)通过渲染纹理展示地球仪
- Android开发笔记(八十七)几个修饰关键字
- vue2.x-cnode(vue全家桶)