python 2.7 unicode2.7 中文字符编码,使用Unicode时,选择什么编码格式

怎么解决读取txt文件读取时中文乱码问题???【python吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:137,520贴子:
怎么解决读取txt文件读取时中文乱码问题???收藏
我要从txt文件中读取中文,可是。。。。。一堆。。。
龙膜PPF隐形车衣车漆透明膜什么价格?上海隐形车衣贴膜哪里好?
txt文件中是什么编码的,要转换一下,例如f.read().decode("gbk")
for line in inffi.readlines()....line.decode('gbk')
另外要注意文件的编码,如果是utf-8的要用decode('utf-8')
import codecscodecs.open('x.txt', 'r', 'gbk')
这个问题,看你原来的文本文件格式保存的是utf-8还是gb2312一般这样处理mystr.decode('utf-8').encode('gb2312')或mystr.decode('gb2312').encode('utf-8')来自sina微博“python爱好者”的回答。
有些是有bom头的,把头去掉再解码
codecs正解
以下的前提是python2.7先用一些编辑器比喻editplus 看一下你的txt文件保存的是utf-8,还是gb2312或其他的。当你读行时可以这样line = (file1.readline()).decode('utf-8').encode('gb2312')或line = (file1.readline()).decode('gb2312').encode('utf-8')一些朋友对python2的汉字编码没有搞很清楚,就认为很难搞,就学python3.其实很好搞,字符串在Python2.7内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码成unicode,再从unicode编码成另一种编码。抓住"字符串在Python2.7内部的表示是unicode编码"这个本质,再用这个万能的代码decode('gb2312','ignore').encode('utf-8') 或decode('utf-8','ignore').encode('gb2312')等等
你们都忽略了一个问题。txt使用utf8编码的时候会默认在文件开头插入三个不可见字符。这个是windows用来判断txt编码是否为utf8的。所以如果你直接使用decode('utf-8')的话是得不到正确结果的。必须先判断前三个字符是否是windows插入的那三个。这个python已经定义了一个常量了,可以直接和这个常量比较,如果一样就删除前三个字符然后再decode。不过常量名我忘了。。。百度一下吧ps.其他文本编辑器不会出现这个问题。只有txt选择utf8会这样。
51CTO学院11年行业品牌,1400万用户选择,中国专业IT技能学习平台,python.通过在线学习的方式,帮助广大技术人员实现技能提升,高薪就业的职业梦想,python.
python3下比较简单,打开的时候指定encoding参数即可:open("txt.txt", encoding="gbk").read()
list中取出来字符然后再decode(*gbk*).encode(*utf-8*) 就可以了
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或Python-字符编码详解 - John_ABC - 博客园
随笔 - 355, 文章 - 0, 评论 - 6, 引用 - 0
1. 字符编码简介
1.1. ASCII
ASCII(American Standard Code for Information Interchange),是一种单字节的编码。计算机世界里一开始只有英文,而单字节可以表示256个不同的字符,可以表示所有的英文字符和许多的控制 符号。不过ASCII只用到了其中的一半(\x80以下),这也是MBCS得以实现的基础。
然而计算机世界里很快就有了其他语言,单字节的ASCII已无法满足需求。后来每个语言就制定了一套自己的编码,由于单字节能表示的字符太少,而且同时也需要与ASCII编码保持兼容,所以这些编码纷纷使用了多字节来表示字符,如GBxxx、BIGxxx等等,他们的规则是,如果第一个字节是\x80以下,则仍然表示ASCII字符;而如果是\x80以上,则跟下一个字节一起(共两个字节)表示一个字符,然后跳过下一个字节,继续往下判断。
这里,IBM发明了一个叫Code Page的概念,将这些编码都收入囊中并分配页码,GBK是第936页,也就是CP936。所以,也可以使用CP936表示GBK。
MBCS(Multi-Byte Character Set)是这些编码的统称。目前为止大家都是用了双字节,所以有时候也叫做DBCS(Double-Byte Character Set)。必须明确的是,MBCS并不是某一种特定的编码,Windows里根据你设定的区域不同,MBCS指代不同的编码,而Linux里无法使用 MBCS作为编码。在Windows中你看不到MBCS这几个字符,因为微软为了更加洋气,使用了ANSI来吓唬人,记事本的另存为对话框里编码ANSI就是MBCS。同时,在简体中文Windows默认的区域设定里,指代GBK。
1.3. Unicode
后来,有人开始觉得太多编码导致世界变得过于复杂了,让人脑袋疼,于是大家坐在一起拍脑袋想出来一个方法:所有语言的字符都用同一种字符集来表示,这就是Unicode。
最初的Unicode标准UCS-2使用两个字节表示一个字符,所以你常常可以听到Unicode使用两个字节表示一个字符的说法。但过了不久有人觉得256*256太少了,还是不够用,于是出现了UCS-4标准,它使用4个字节表示一个字符,不过我们用的最多的仍然是UCS-2。
UCS(Unicode Character Set)还仅仅是字符对应码位的一张表而已,比如"汉"这个字的码位是6C49。字符具体如何传输和储存则是由UTF(UCS Transformation Format)来负责。
一开始这事很简单,直接使用UCS的码位来保存,这就是UTF-16,比如,"汉"直接使用\x6C\x49保存(UTF-16-BE),或是倒过来使用\x49\x6C保存(UTF-16-LE)。但用着用着美国人觉得自己吃了大亏,以前英文字母只需要一个字节就能保存了,现在大锅饭一吃变成了两个字节,空间消耗大了一倍&&于是UTF-8横空出世。
UTF-8是一种很别扭的编码,具体表现在他是变长的,并且兼容ASCII,ASCII字符使用1字节表示。然而这里省了的必定是从别的地方抠出来 的,你肯定也听说过UTF-8里中文字符使用3个字节来保存吧?4个字节保存的字符更是在泪奔&&(具体UCS-2是怎么变成UTF-8的请自行搜索)
另外值得一提的是BOM(Byte Order Mark)。我们在储存文件时,文件使用的编码并没有保存,打开时则需要我们记住原先保存时使用的编码并使用这个编码打开,这样一来就产生了许多麻烦。 (你可能想说记事本打开文件时并没有让选编码?不妨先打开记事本再使用文件 -& 打开看看)而UTF则引入了BOM来表示自身编码,如果一开始读入的几个字节是其中之一,则代表接下来要读取的文字使用的编码是相应的编码:
BOM_UTF8 '\xef\xbb\xbf' BOM_UTF16_LE '\xff\xfe'
BOM_UTF16_BE '\xfe\xff'
并不是所有的编辑器都会写入BOM,但即使没有BOM,Unicode还是可以读取的,只是像MBCS的编码一样,需要另行指定具体的编码,否则解码将会失败。
你可能听说过UTF-8不需要BOM,这种说法是不对的,只是绝大多数编辑器在没有BOM时都是以UTF-8作为默认编码读取。即使是保存时默认使
用ANSI(MBCS)的记事本,在读取文件时也是先使用UTF-8测试编码,如果可以成功解码,则使用UTF-8解码。记事本这个别扭的做法造成了一个
BUG:如果你新建文本文件并输入"姹塧"然后使用ANSI(MBCS)保存,再打开就会变成"汉a",你不妨试试 :)
2. Python2.x中的编码问题
2.1. str和unicode
str和unicode都是basestring的子类。严格意义上说,str其实是字节串,它是unicode经过编码后的字节组成的序列。对
UTF-8编码的str'汉'使用len()函数时,结果是3,因为实际上,UTF-8编码的'汉' == '\xE6\xB1\x89'。
unicode才是真正意义上的字符串,对字节串str使用正确的字符编码进行解码后获得,并且len(u'汉') == 1。
再来看看encode()和decode()两个basestring的实例方法,理解了str和unicode的区别后,这两个方法就不会再混淆了:
print repr(u)
s = u.encode('UTF-8')
print repr(s)
u2 = s.decode('UTF-8')
print repr(u2)
需要注意的是,虽然对str调用encode()方法是错误的,但实际上Python不会抛出异常,而是返回另外一个相同内容但不同id的str;
对unicode调用decode()方法也是这样。很不理解为什么不把encode()和decode()分别放在unicode和str中而是都放在
basestring中,但既然已经这样了,我们就小心避免犯错吧。
如果你在Windows控制台下运行此代码的话,虽然程序是执行了,但屏幕上打印出的却不是哈字。这是由于python编码与控制台编码的不一致造成的。Windows下控制台中的编码使用的& 是gbk,而在代码中使用的utf-8,python按照utf-8编码打印到gbk编码的控制台下自然就会不一致而不能打印出正确的汉字。
type(&哈&),会得到&type &str&&,而type(u&哈&),则会得到&type &unicode&&,也就是在字符前面加u就表明这是一个unicode对象,这个字会以unicode格式存在于内存中,而如果不加u& ,表明这仅仅是一个使用某种编码的字符串,编码格式取决于python对源码文件编码的识别,这里就是utf-8。& Python在向控制台输出unicode对象的时候会自动根据输出环境的编码进行转换,但如果输出的不是unicode对象而是普通字符串,则会直接按照字符串的编码输出字符串,从而出现上面的现 象。
2.2. 字符编码声明
源代码文件中,如果有用到非ASCII字符,则需要在文件头部进行字符编码的声明,如下:
告知python我这个文件里的文本是用utf-8编码的,这样,python就会依照utf-8的编码形式解读其中的字符,然后转换成unicode编码内部处理使用。
实际上Python只检查#、coding和编码字符串,其他的字符都是为了美观加上的。另外,Python中可用的字符编码有很多,并且还有许多别名,还不区分大小写,比如UTF-8可以写成u8。参见。
另外需要注意的是声明的编码必须与文件实际保存时用的编码一致,否则很大几率会出现代码解析异常。现在的IDE一般会自动处理这种情况,改变声明后同时换成声明的编码保存,但文本编辑器控们需要小心 :)
2.3. 读写文件
内置的open()方法打开文件时,read()读取的是str,读取后需要使用正确的编码格式进行decode()。write()写入时,如果
参数是unicode,则需要使用你希望写入的编码进行encode(),如果是其他编码格式的str,则需要先用该str的编码进行decode(),
转成unicode后再使用写入的编码进行encode()。如果直接将unicode作为参数传入write()方法,Python将先使用源代码文件
声明的字符编码进行编码然后写入。
f = open('test.txt')
s = f.read()
print type(s)
u = s.decode('GBK')
f = open('test.txt', 'w')
s = u.encode('UTF-8')
f.write(s)
另外,模块codecs提供了一个open()方法,可以指定一个编码打开文件,使用这个方法打开的文件读取返回的将是unicode。写入时,如
果参数是unicode,则使用open()时指定的编码进行编码后写入;如果是str,则先根据源代码文件声明的字符编码,解码成unicode后再进
行前述操作。相对内置的open()来说,这个方法比较不容易在编码上出现问题。
import codecs
f = codecs.open('test.txt', encoding='UTF-8')
u = f.read()
print type(u)
f = codecs.open('test.txt', 'a', encoding='UTF-8')
f.write(u)
print repr(s)
f.write(s)
2.4. 与编码相关的方法
sys/locale模块中提供了一些获取当前环境下的默认编码的方法。
import sys
import locale
&&&&print '%s.%s(): %s' % (f.__module__, f.__name__, f())
p(sys.getdefaultencoding)
p(sys.getfilesystemencoding)
p(locale.getdefaultlocale)
p(locale.getpreferredencoding)
print r"'\xba\xba'.decode('mbcs'):", repr('\xba\xba'.decode('mbcs'))
3.一些建议
3.1. 使用字符编码声明,并且同一工程中的所有源代码文件使用相同的字符编码声明。
这点是一定要做到的。
3.2. 抛弃str,全部使用unicode。
按引号前先按一下u最初做起来确实很不习惯而且经常会忘记再跑回去补,但如果这么做可以减少90%的编码问题。如果编码困扰不严重,可以不参考此条。
3.3. 使用codecs.open()替代内置的open()。
如果编码困扰不严重,可以不参考此条。
3.4. 绝对需要避免使用的字符编码:MBCS/DBCS和UTF-16。
这里说的MBCS不是指GBK什么的都不能用,而是不要使用Python里名为'MBCS'的编码,除非程序完全不移植。
Python中编码'MBCS'与'DBCS'是同义词,指当前Windows环境中MBCS指代的编码。Linux的Python实现中没有这种
编码,所以一旦移植到Linux一定会出现异常!另外,只要设定的Windows系统区域不同,MBCS指代的编码也是不一样的。分别设定不同的区域运行
2.4小节中的代码的结果:
可见,更改区域后,使用mbcs解码得到了不正确的结果,所以,当我们需要使用'GBK'时,应该直接写'GBK',不要写成'MBCS'。
UTF-16同理,虽然绝大多数操作系统中'UTF-16'是'UTF-16-LE'的同义词,但直接写'UTF-16-LE'只是多写3个字符而
已,而万一某个操作系统中'UTF-16'变成了'UTF-16-BE'的同义词,就会有错误的结果。实际上,UTF-16用的相当少,但用到的时候还是
需要注意。在Python中关于中文编码问题的处理建议
投稿:goldensun
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了几种在Python中关于中文编码问题的处理方法,包括在使用Unicode编码时碰到的异常等,需要的朋友可以参考下
字符串是Python中最常用的数据类型,而且很多时候你会用到一些不属于标准ASCII字符集的字符,这时候代码就很可能抛出UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 10: ordinal not in range(128)异常。这种异常在Python中很容易遇到,尤其是在Python2.x中,是一个很让初学者费解头疼的问题。不过,如果你理解了Python的Unicode,并在编码中遵循一定的原则,这种编码问题还是比较容易理解和解决的。
字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。但是,Python 2.x的默认编码格式是ASCII,就是说,在没有指定Python源码编码格式的情况下,源码中的所有字符都会被默认为ASCII码。也因为这个根本原因,在Python 2.x中经常会遇到UnicodeDecodeError或者UnicodeEncodeError的异常。
关于Unicode
Unicode是一种字符集,它为每一种现代或古代使用的文字系统中出现的每一个字符都提供了统一的序列号,规定了符号的二进制代码,但没有规定这个二进制代码应该如何存储。也就是说:Unicode的编码方式是固定的,但是实现方式根据不同的需要有跟多种,常见的有UTF-8、UTF-16和UTF-32等。更多的介绍大家可以参看维基百科:Unicode
为了能够处理Unicode数据,同时兼容Python某些内部模块,Python 2.x中提供了Unicode这种数据类型,通过decode和encode方法可以将其它编码和Unicode编码相互转化,但同时也引入了UnicodeDecodeError和UnicodeEncodeError异常。。
常见的几种编码异常
Python中常见的几种编码异常有SyntaxError: Non-ASCII character、UnicodeDecodeError和UnicodeEncodeError等。下面依次举例说明一下:
1、SyntaxError: Non-ASCII character
这种异常最不容易出现,也最容易处理,主要原因是Python源码文件中有非ASCII字符,而且同时没有声明源码编码格式,例如:
s = '中文'
# 抛出异常
2、UnicodeDecodeError
这个异常有时候会在调用decode方法时出现,原因是Python打算将其他编码的字符转化为Unicode编码,但是字符本身的编码格式和decode方法传入的编码格式不一致,例如:
#!/usr/bin/python
# -*- coding: utf-8 -*-
s = '中文'
s.decode('gb2312') # UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 2-3: illegal multibyte sequence
上面这段代码中字符串s的编码格式是utf-8,但是在使用decode方法转化为Unicode编码时传入的参数是‘gb2312',因此在转化的时候抛出UnicodeDecodeError异常。还有一种情况是在encode的时候:
#!/usr/bin/python
# -*- coding: utf-8 -*-
s = '中文'
s.encode('gb2312') # UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
3、UnicodeEncodeError
错误的使用decode和encode方法会出现这种异常,比如:使用decode方法将Unicode字符串转化的时候:
#!/usr/bin/python
# -*- coding: utf-8 -*-
s = u'中文'
s.decode('utf-8') # UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
当然,除了上面列出的几种出现异常的情况之外还有很多可能出现异常的例子,这里就不在一一说明了。
对于以上的几个异常,有以下几个处理的方法和原则。
1、遵循PEP0263原则,声明编码格式
在PEP 0263 -- Defining Python Source Code Encodings中提出了对Python编码问题的最基本的解决方法:在Python源码文件中声明编码格式,最常见的声明方式如下:
#!/usr/bin/python
# -*- coding: &encoding name& -*-
其中&encoding name&是代码所需要的编码格式,它可以是任意一种Python支持的格式,一般都会使用utf-8的编码格式。
2、使用u'中文'替代'中文'
str1 = '中文编码'
str2 = u'中文编码'
Python中有以上两种声明字符串变量的方式,它们的主要区别是编码格式的不同,其中,str1的编码格式和Python文件声明的编码格式一致,而str2的编码格式则是Unicode。如果你要声明的字符串变量中存在非ASCII的字符,那么最好使用str2的声明格式,这样你就可以不需要执行decode,直接对字符串进行操作,可以避免一些出现异常的情况。
3、Reset默认编码
Python中出现这么多编码问题的根本原因是Python 2.x的默认编码格式是ASCII,所以你也可以通过以下的方式修改默认的编码格式:
import sys
sys.setdefaultencoding('utf-8')
这种方法是可以解决部分编码问题,但是同时也会引入很多其他问题,得不偿失,不建议使用这种方式。
4、终极原则:decode early, unicode everywhere, encode late
最后分享一个终极原则:decode early, unicode everywhere, encode late,即:在输入或者声明字符串的时候,尽早地使用decode方法将字符串转化成unicode编码格式;然后在程序内使用字符串的时候统一使用unicode格式进行处理,比如字符串拼接、字符串替换、获取字符串的长度等操作;最后,在输出字符串的时候(控制台/网页/文件),通过encode方法将字符串转化为你所想要的编码格式,比如utf-8等。
按照这个原则处理Python的字符串,基本上可以解决所有的编码问题(只要你的代码和Python环境没有问题)。。。
5、升级Python 2.x到3.x
额,最后一个方法,升级Python 2.x,使用Python 3.x版本。。这样说主要是为了吐槽Python 2.x的编码设计问题。当然,升级到Python 3.x肯定可以解决大部分因为编码产生的异常问题。毕竟Python 3.x版本对字符串这部分还是做了相当大的改进的,具体的下面会说。。。。
Python 3.x中的Unicode
在Python 3.0之后的版本中,所有的字符串都是使用Unicode编码的字符串序列,同时还有以下几个改进:
1、默认编码格式改为unicode
2、所有的Python内置模块都支持unicode
3、不再支持u'中文'的语法格式
所以,对于Python 3.x来说,编码问题已经不再是个大的问题,基本上很少遇到上述的几个异常。关于Python 2.x str&unicode和Python 3.x str&bytes的更多说明和对比,大家可以看一下:
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具8168人阅读
Python(40)
http://字符编码详解[]Python源码的编码方式str与字节码s = &人生苦短&s是个字符串,它本身存储的就是字节码(这个s可能是文件中的一行,或者命令行中的一行?)。那么这个字节码是什么格式的?如果这段代码是在解释器上输入的,那么这个s的格式就是解释器的编码格式,对于windows的cmd而言,就是gbk。如果将段代码是保存后才执行的,比如存储为utf-8,那么在解释器载入这段程序的时候,就会将s初始化为utf-8编码。unicode与str我们知道unicode是一种编码标准,具体的实现标准可能是utf-8,utf-16,gbk ......python 在内部使用两个字节来存储一个unicode,使用unicode对象而不是str的好处,就是unicode方便于跨平台。你可以用如下两种方式定义一个unicode:(在python2中)1 s1 = u&人生苦短&
2 s2 = unicode(&人生苦短&, &utf-8&)python3字符串实际就是用的unicode,直接s = &人生苦短&py3定义bytes使用sb = b'dfja'python 2.x和3.x中的字符串编码区别2.x中字符串有str和unicode两种类型,str有各种编码区别,unicode是没有编码的标准形式。unicode通过编码转化成str,str通过解码转化成unicode。3.x中将字符串和字节序列做了区别,字符串str是字符串标准形式与2.x中unicode类似,bytes类似2.x中的str有各种编码区别。bytes通过解码转化成str,str通过编码转化成bytes。2.x中可以查看unicode字节序列,3.x中不能。Python 2:Python 2的源码.py文件默认的编码方式为ASCII如果想使用一种不同的编码方式来保存Python代码,我们可以在每个文件的第一行放置编码声明(encoding declaration)。以下声明定义.py文件使用windows-1252编码方式:# -*- coding: windows-1252 -*-Note: 1. 从技术上说,字符编码的重载声明也可以放在第二行,如果第一行被类UNIX系统中的hash-bang命令占用了。2. 了解更多信息,请参阅PEP263: 指定Python源码的编码方式。Python 3:Python 3的源码.py文件 的默认编码方式为UTF-8Python 3.x中的Unicode在Python 3.0之后的版本中,所有的字符串都是使用Unicode编码的字符串序列,同时还有以下几个改进:1、默认编码格式改为unicode2、所有的Python内置模块都支持unicode3、不再支持u中文的语法格式所以,对于Python 3.x来说,编码问题已经不再是个大的问题,基本上很少遇到编码异常。在Python 3,所有的字符串都是使用Unicode编码的字符序列。不再存在以UTF-8或者CP-1252编码的情况。也就是说,这个字符串是以UTF-8编码的吗?不再是一个有效问题。UTF-8是一种将字符编码成字节序列的方式。如果需要将字符串转换成特定编码的字节序列,Python 3可以为你做到。如果需要将一个字节序列转换成字符串,Python 3也能为你做到。字节即字节,并非字符。字符在计算机内只是一种抽象。字符串则是一种抽象的序列。&&& s = &深入 Python&
&&& len(s)
&&& s + & 3&
&深入 Python 3&Python中,字符串可以想像成由字符组成的元组。Just like getting individual items out of a list, you can get individual characters out of a string using index notation.与取得列表中的元素一样,也可以通过下标记号取得字符串中的某个字符。python中设置默认编码defaultencoding设置defaultencoding的代码如下:1 reload(sys)
2 sys.setdefaultencoding('utf-8')如果你在python中进行编码和解码的时候,不指定编码方式,那么python就会使用defaultencoding。比如上一节例子中将str编码为另一种格式,就会使用defaultencoding。s.encode(&utf-8&) 等价于 s.decode(defaultencoding).encode(&utf-8&)Note: 这个过程是s先通过defaultencoding解码为unicode,再编码为utf-8类型的编码。再比如你使用str创建unicode对象时,如果不说明这个str的编码格式,那么程序也会使用defaultencoding。u = unicode(&人生苦短&) 等价于 u = unicode(&人生苦短&,defaultencoding)默认的defaultcoding ascii是许多错误的原因,所以早早的设置defaultencoding是一个好习惯。文件头声明编码关于python文件头部分知识的讲解顶部的:# -*- coding: utf-8 -*-或者# coding: utf-8目前有三个作用如果代码中有中文注释,就需要此声明。比较高级的编辑器(比如我的emacs),会根据头部声明,将此作为代码文件的格式。程序会通过头部声明,解码初始化 u&人生苦短&,这样的unicode对象,(所以头部声明和代码的存储格式要一致)。Example11 # -*- coding:utf-8 -*-
2 su = &人生苦短&
3 # : su是一个utf-8格式的字节串
= s.decode(&utf-8&)
5 # : s被解码为unicode对象,赋给u
6 sg = u.encode(&gbk&)
7 # : u被编码为gbk格式的字节串,赋给sg
8 print sg
9 # 打印sg但是事实情况要比这个复杂,比如看如下代码:1 s = &人生苦短&
2 s.encode('gbk')看!str也能编码,(事实上unicode对象也能解码,但是意义不大)Note:原理,当对str进行编码时,会先用默认编码将自己解码为unicode,然后在将unicode编码为你指定编码。这就引出了python2.x中在处理中文时,大多数出现错误的原因所在:python的默认编码,defaultencoding是ascii看这个例子:1 # -*- coding: utf-8 -*-
2 s = &人生苦短&
3 s.encode('gbk')上面的代码会报错,错误信息:UnicodeDecodeError: 'ascii' codec can't decode byte ......因为你没有指定defaultencoding,所以它其实在做这样的事情:1 # -*- coding: utf-8 -*-
2 s = &人生苦短&
3 s.decode('ascii').encode('gbk')Example2python2.x示例:[python] &&&&ss&=&'北京市'&&&&&&type(ss)&&&type&'str'&&&&&&&us&=&ss.decode('gbk')&&&&&&us&&u'\u5317\u4eac\u5e02'&&&&&&type(us)&&&type&'unicode'&&&&&&&nus&=&u'北京市'&&&&&&nus&&u'\u5317\u4eac\u5e02'&&&&&&ss&&'\xb1\xb1\xbe\xa9\xca\xd0'&&&&&&gbks&=&nus.encode('gbk')&&&&&&gbks&&'\xb1\xb1\xbe\xa9\xca\xd0'&&&&&&print(gbks)&&北京市&&&&&&utfs&=&nus.encode('utf-8')&&&&&&utfs&&'\xe5\x8c\x97\xe4\xba\xac\xe5\xb8\x82'&&&&&&print(utfs)&&鍖椾含甯&&&&&&xx&=&utfs.decode('utf-8')&&&&&&type(xx)&&&type&'unicode'&&&ss = '北京市' 采用终端默认的编码形式,windows命名行窗口默认是gbk编码,所以通过ss.decode('gbk')转化成unicode的序列。最后utf-8编码的utfs输出乱码也是因为cmd终端是gdk编码的。该示例中可以看到“北京市”的三种编码序列:unicode序列:u'\u5317\u4eac\u5e02'gbk序列:'\xb1\xb1\xbe\xa9\xca\xd0'utf-8序列:'\xe5\x8c\x97\xe4\xba\xac\xe5\xb8\x82'python3.x示例:[python] Python&3.4.1&(v3.4.1:c0e311e010fc,&May&18&2014,&10:38:22)&[MSC&v.1600&32&bit&(In&&tel)]&on&win32&&Type&&help&,&&copyright&,&&credits&&or&&license&&for&more&information.&&&&&&ss&=&'北京市'&&&&&&type(ss)&&&class&'str'&&&&&&&us&=&ss.encode('gbk')&&&&&&type(us)&&&class&'bytes'&&&&&&&us&&b'\xb1\xb1\xbe\xa9\xca\xd0'&&&&&&utfs&=&ss.encode('utf-8')&&&&&&print(utfs)&&b'\xe5\x8c\x97\xe4\xba\xac\xe5\xb8\x82'&&&&&&type(utfs)&&&class&'bytes'&&&&&&&xx&=&utfs.decode('utf-8')&&&&&&type(xx)&&&class&'str'&&&&&&&print(xx)&&北京市&&&&&&import&urllib.parse&&&&&&res&=&urllib.parse.quote(utfs)&&&&&&res&&'%E5%8C%97%E4%BA%AC%E5%B8%82'&&3.x 想要查看字符串各种编码序列,只能通过encode转化成bytes类型,然后输出。str是标准形式没办法直接查看其字节序列。。通过urllib.parse.quote 将字节序列转化成url的中文编码形式,逆过程是unquote函数。python编码错误及解决方法字符串是Python中最常用的数据类型,而且很多时候你会用到一些不属于标准ASCII字符集的字符,这时候代码就很可能抛出UnicodeDecodeError: ascii codec cant decode byte 0xc4 in position 10: ordinal not in range(128)异常。这种异常在Python中很容易遇到,尤其是在Python2.x中。字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。但是,Python 2.x的默认编码格式是ASCII,就是说,在没有指定Python源码编码格式的情况下,源码中的所有字符都会被默认为ASCII码。也因为这个根本原因,在Python 2.x中经常会遇UnicodeDecodeError或者UnicodeEncodeError的异常。Unicode为了能够处理Unicode数据,同时兼容Python某些内部模块,Python 2.x中提供了Unicode这种数据类型,通过decode和encode方法可以将其它编码和Unicode编码相互转化,但同时也引入了UnicodeDecodeError和UnicodeEncodeError异常。python常见编码异常(几乎都只存在于python2中)Python中常见的几种编码异常有SyntaxError: Non-ASCII character、UnicodeDecodeError和UnicodeEncodeError等。1、SyntaxError: Non-ASCII character这种异常最不容易出现,也最容易处理,主要原因是Python源码文件中有非ASCII字符,而且同时没有声明源码编码格式,例如:s = 中文print s# 抛出异常解决: 文件头部声明编码# -*- coding: utf-8 -*-Python2中,如果在源码首行(或在指定sha-bang时的第二行)不显式指定编码,则无法在源码中出现非ASCII字符。这是由于Python解释器默认将源码认作ASCII编码格式。[]2、UnicodeDecodeError这个异常有时候会在调用decode方法时出现,原因是Python打算将其他编码的字符转化为Unicode编码,但是字符本身的编码格式和decode方法传入的编码格式不一致,例如:#!/usr/bin/python# -*- coding: utf-8 -*-s = 中文s.decode(gb2312)# UnicodeDecodeError: gb2312 codec cant decode bytes in position 2-3: illegal multibyte sequenceprint sNote:上面这段代码中字符串s的编码格式是utf-8(# -*- coding: utf-8 -*-声明的意思是:当前.py文件中所有的字符串是utf-8编码的),但是在使用decode方法转化为Unicode编码时传入的参数是‘gb2312’,因此在转化的时候抛出UnicodeDecodeError异常。还有一种情况是在encode的时候:#!/usr/bin/python# -*- coding: utf-8 -*-s = 中文s.encode(gb2312)# UnicodeDecodeError: ascii codec cant decode byte 0xe4 in position 0: ordinal not in range(128)print sNote:这里的s是utf-8编码的,直接使用s.encode(gb2312)实际使用了系统默认defalutencoding来解码,等价于s.decode(defaultencoding).encode(gb2312),而s的实际编码与defaultencoding不同。3、UnicodeEncodeError错误的使用decode和encode方法会出现这种异常,比如:使用decode方法将Unicode字符串转化的时候:#!/usr/bin/python# -*- coding: utf-8 -*-s = u中文s.decode(utf-8)# UnicodeEncodeError: ascii codec cant encode characters in position 0-1: ordinal not in range(128)print spython编码异常解决方法1、遵循PEP0263原则,声明编码格式(lz推荐)在PEP 0263 Defining Python Source Code Encodings中提出了对Python编码问题的最基本的解决方法:在Python源码文件中声明编码格式,最常见的声明方式如下:#!/usr/bin/python# -*- coding: &encoding name& -*-Note:其中&encoding name&是代码所需要的编码格式,它可以是任意一种Python支持的格式,一般都会使用utf-8的编码格式。# -*- coding: utf-8 -*-是Python文件声明,意思是:当前.py文件中所有的字符串是utf-8编码的,不是读取的文件是用utf-8编码读取的!2、使用u中文替代中文(py2)str1 = 中文编码str2 = u中文编码Python中有以上两种声明字符串变量的方式,它们的主要区别是编码格式的不同,其中,str1的编码格式和Python文件声明的编码格式一致,而str2的编码格式则是Unicode。如果你要声明的字符串变量中存在非ASCII的字符,那么最好使用str2的声明格式,这样你就可以不需要执行decode,直接对字符串进行操作,可以避免一些出现异常的情况。Note:python3不支持u的声明方式。3、Reset默认编码Python中出现这么多编码问题的根本原因是Python 2.x的默认编码格式是ASCII,所以你也可以通过以下的方式修改默认的编码格式:import syssys.setdefaultencoding(utf-8)这种方法是可以解决部分编码问题,但是同时也会引入很多其他问题,得不偿失,不建议使用这种方式。4、终极原则:decode early, unicode everywhere, encode late即:在输入或者声明字符串的时候,尽早地使用decode方法将字符串转化成unicode编码格式;然后在程序内使用字符串的时候统一使用unicode格式进行处理,比如字符串拼接、字符串替换、获取字符串的长度等操作;最后,在输出字符串的时候(控制台/网页/文件),通过encode方法将字符串转化为你所想要的编码格式,比如utf-8等。按照这个原则处理Python的字符串,基本上可以解决所有的编码问题(只要你的代码和Python环境没有问题)。另外还应该使用codecs模块打开文件内置的open函数打开文件时,read方法读取的是一个str(私以为叫做字节数组更合适),如果读取的是其它编码的文字,则需要decode之后再做使用。对于使用open函数打开文件之后的写操作(多字节编码的字符串),则需要将需要写入的字符串按照其编码encode为一个str,如果直接写入,则会引发如下错误(如果在代码中加入了encoding声明,则会按照声明的编码格式encode后写入):除此以外,codecs模块也提供了一个open函数,可以直接指定好编码打开一个文本文件,那么读取到的文件内容则直接是一个unicode字符串。对应的指定编码后的写入文件,则可以直接将unicode写到文件中。通过codecs.open可以避免很多编码问题:5、升级Python 2.x到3.x主要是因为Python 2.x的编码设计问题。当然,升级到Python 3.x肯定可以解决大部分因为编码产生的异常问题。毕竟Python 3.x版本对字符串这部分还是做了相当大的改进的。原因参见前面关于python2.x和3.x的区别。python读取文件编码错误出现乱码首先用notepad++等文本查看器查看读取文件的编码,如文件编码为utf-8则使用utf-8编码方式打开{其它格式还有gbk, gb2312,ansi等等}file = open(filename, encoding='UTF-8')
基本没有编码错误,还是出现某几个字符错误也可以用‘ignore’忽略掉file = open(filename, encoding='UTF-8', errors='ignore')[]python读取文件BOM字符处理在windows上使用open打开utf-8编码的txt文件时开头会有一个多余的字符\ufeff,它叫BOM,是用来声明编码等信息的,但python会把它当作文本解析。对UTF-16, Python将BOM解码为空字串。然而对UTF-8, BOM被解码为一个字符\ufeff。如何去掉bom字符?解决修改encoding为utf-8_sig或者utf_8_sigopen('1.txt', encoding='utf_8_sig' )[][]from:http://blog.csdn.net/pipisorry/article/details/ref: http://mp./s?__biz=MjM5NzU0MzU0Nw==&mid=&idx=1&sn=cbe436b2ecf1bb7f4fc7&from=singlemessage&isappinstalled=0#rd
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1624203次
积分:19528
积分:19528
排名:第372名
原创:521篇
转载:73篇
评论:169条
文章:21篇
阅读:85199
阅读:23064
文章:13篇
阅读:46813
阅读:27769
文章:16篇
阅读:78800
文章:18篇
阅读:42572
Contact me

我要回帖

更多关于 python unicode字符 的文章

 

随机推荐