您的位置:首页 > 编程语言 > Python开发

我在python字符编码上走过的弯路

2015-11-25 17:51 811 查看
水平有限,见得不多,一点经验,还要学习一个,欢迎大家批评naive,simple,young。

在我不长的编程生涯中,在字符处理特别是涉及到中文字符处理的过程划过很多时间。每次都是这次成功解决隔一段时间时间又忘记了还好从头再来弄一次。所以这次决定好好梳理下Python里的编码和与编码有关的函数。

当有一个文件需要处理是你第一步需要知道这个文件试用什么样的编码方式保存,不同的保存方式就意味着不同的处理方式。这点很重要。一般来说主流的文本储存方式不外乎UTF-8,GBK,ASCII这三种。在网络世界里又以UTF-8作为最常使用的编码。

那什么是UTF-8呢?

UTF-8的全称是8-bit Unicode Transformation Format,是一种针对Unicode的可变长度字元编码,也是一种前缀码。他的第一个字节可以完全兼容ASCII,即当我们需要保存的字符没有超过ASCII的范围时,UTF-8就用其第一个字节来保存,如果超过了就会由第一字节的前几位表示该unicode字元的长度,比如110xxxxxx前三位的二进制表示告诉我们这是个2BYTE的UNICODE字元。

什么是ASCII?

ASCII是一种7位用来存储美式键盘中字母,符号以及数字的字符集,共128个字元。不能用来处理带音调以及更加复杂的字符。

什么是unicode?

是计算机科学领域里的一项业界标准。Unicode是为了解决传统的字元编码方案的局限而产生的,Unicode的实现方式不同于编码方式。一个字符的Unicode编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的实现方式有所不同。Unicode的实现方式称为Unicode转换格式(Unicode Transformation Format,简称为UTF)。

Python中常用编码函数。

decode()&encode()

>>>help(str.decode)

Decodes S using the codec registered for encoding. encoding defaults
to the default encoding. errors may be given to set a different error
handling scheme. Default is 'strict' meaning that encoding errors raise
a UnicodeDecodeError. Other possible values are 'ignore' and 'replace'
as well as any other name registered with codecs.register_error that is
able to handle UnicodeDecodeErrors.


>>>help(str.encode)

Encodes S using the codec registered for encoding. encoding defaults
to the default encoding. errors may be given to set a different error
handling scheme. Default is 'strict' meaning that encoding errors raise
a UnicodeEncodeError. Other possible values are 'ignore', 'replace' and
'xmlcharrefreplace' as well as any other name registered with
codecs.register_error that is able to handle UnicodeEncodeErrors.


通过查看python的help可以得知,decode和encode都是方法。

>>>decode(input, errors='strict')


decode()共有两个参数,第一个input指定的是需要解码的解码方式,第二个errors有默认值,当使用默认值是遇见不能handle的字符时将会抛出一个UnicodeDecodeError。errors的可选值还有‘ignore’和‘replace’。选择‘ignore’意味着忽略在解码过程中不能解码的字符,只留下可以识别的字符。而“replace”则是替换掉不能识别的字符。此方法返回的字符串的解码版本。

>>>encode(input, errors='strict')


encode()共有两个参数,第一个input指定的是需要编码的解码方式,第二个errors有默认值,当使用默认值是遇见不能handle的字符时将会抛出一个UnicodeDecodeError。errors的可选值还有‘ignore’和‘replace’。选择‘ignore’意味着忽略在解码过程中不能解码的字符,只留下可以识别的字符。而“replace”则是替换掉不能识别的字符。此方法返回的字符串的编码版本。

decode()用法举例。

>>> decode_ex = "abc"
>>> decode_utf8=decode_ex.decode("utf-8")
>>> decode_utf8


结果

u'abc'


encode()用法举例。

>>> encode_ex = decode_utf8.('utf-8')
>>> encode_ex


结果:

'abc'


从这几句代码可以很明显的得知,decode()是吧一个已知编码的字符转为unicode,而encode()是把一个unicode转为一个所提供的字符编码。

当从TXT文件中读取中文时

这个问题应当所有写Python代码的人都遇到过,有时候读出来时乱码,有时候又不是,这样怎么解决的?

很简单,和把大象放冰箱一样也只需要三步就可以解决。

第一步:弄清你所需要的读取的原文件是什么编码方式。

强烈建议大家不要用windows自带的记事本来来作为默认TXT打开方式,这个windows工具会在文本前面加上看不见的BOM,很讨厌。如果源文件的编码是UTF-8的话就不用修改,如果是ASCII但文本内只有美式字符也不用修改,其他的话为了方便就把编码方式也改成UTF8吧。

第二步:弄清你的Python脚本是用什么编码方式保存的。

python可以通过一下命令知道目前的默认编码方式:

>>> sys.getdefaultencoding()
'ascii'


可以通过这个命令修改默认编码方式:

>>> import sys
>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.setdefaultencoding('utf-8')
>>> sys.getdefaultencoding()
'utf-8'


第三步:小心的从文件读取数据 ︿( ̄︶ ̄)︿

在再三确认好你要读的问价是什么格式后就可以使用上面提到的decode()和encode()函数将字符以你想要的方式读入Python脚本啦!

从cmd读入数据时

有事后我们需要从终端读入数据,但是终端并不像文件一样可以清楚的知道读入的数据是什么类型的字符,那要怎么办呢?这里向大家介绍一个好用的方法。

sys.stdin.encoding
sys.stdin.decoding


先来介绍下什么是‘sys.stdin’,这是一个重定向的函数,当我们使用

what=raw_input('what is this ')


实际上是在使用

print 'what is this ',
what=sys.stdin.readline()[:-1]


而sys.stdin.decoding则是队从键盘输入的数据调用decoding,将ASCII转换为Unicode的方法。

大概就是这样,没啦,有什么进步再补充拉~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 字符