Python的中文编码问题

基本编码

(1)当没有给定任何编码提示的时候,python默认使用ASCII作为它的标准编码格式。所以对于中文这样的非ASCIIi编码的字符,不指定编码格式时就会报错。
(2)Python里面string类型和Unicode类型是两种不同的类型,string类型的编码格式就是源码的编码格式,而Unicode类型就是unicode编码的。
(3)在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(使用decode方法,参数是数据自身的编码)成unicode,再从unicode编码(encode方法,参数是需要使用的编码格式)成另一种编码。
(4)字符串使用decode正确解码后,字符串就会变成了unicode类型的了。


常见的编码异常

(1)SyntaxError:Non-ASCII character。说的是python源码文件中在没有声明源码编码格式的情况下含有非ASCII字符。因为源码默认ASCII编码格式,当含有中文这样的不能被ASCII格式编码的字符时,就会有这样的错误,所以要指定能够编码中文的的编码格式。
(2)UnicodeDecodeError:这个异常的出现有两种情况:①使用decode方法解码的时候。因为使用decode方法解码时,参数必须是调用decode方法的字符串自身的编码格式,若不是,就会有这样的异常出现;②当没有转换成unicode编码格式时就使用encode方法编码的话,也会弹出这个异常,因为编译器会尝试自己先解码,由于不知道解码格式,所以必然会有这样的错误。
(3)UnicodeEncodeError:当使用decode方法将Unicode字符串进行转换的时候,就会报这个异常。因为Unicode字符串本身已经是可转换状态了,不能再解码了,只能编码,所以编译器把这样的错误归结到编码异常。


解决方法

(1)声明编码格式:当源码(注释也要考虑)包含ASCII编码格式不能编码的字符时,最好先声明编码格式。最常见的声明方法如下:

# _*_ coding: <encoding name> _*_

其中< encoding name >是我们指定的源码的编码格式,可以是任意一种python支持的格式,一般都会使用utf-8格式。

(2)使用u’中文’替代’中文’,如:

str1 = '中文编码'
str2 = u'中文编码'

str1的编码格式是我们所指定的或者是默认的源码编码格式。而str2在前面加个u,表明str2是unicode编码格式。通常来说str2会比str1好,因为当我们需要将字符串转换成其它编码格式时,str2不用decode解码,直接encode编码就可以了,而str1还要根据自己的编码格式先解码,然后再编码成我们想要的编码格式。

(3)Reset默认编码:事实上,我们可以设置python的默认编码格式,通过以下方式:

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等

(5)升级python2.x到python3.x:因为python3.x对字符编码方面做了很大的改进。①默认编码格式改为unicode;②所有的python内置模块都支持unicode;③不再支持u’中文’的语法格式等。


参考文章:
(1)伯乐在线 > Python - 伯乐在线 > 所有文章 > 基础知识 > Python的中文编码问题
(2)PEP 0263 — Defining Python Source Code Encodings

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值