python字符编码问题的总结

概述:

以前刚学python时候遇到了一些关于字符编码的奇怪问题,没有仔细研究,而且为了避免这个问题就全用英文了,但是今天开始写的程序需要抓取网页上的中文,解析下来后字符编码的问题又回来了,而且比以前来的更猛烈,程序崩溃的哗啦呼啦的。所以抽出了很长时间,仔细的研究了一下,希望看到文章的同学也能不再为字符编码的问题困扰。充斥在网络上的信息无数,但他们都逃不出要被编码的命运,在国内的网络环境下,我们可能接触到的编码格式有,ascii,unicode,utf-8,gb2312,gbk等。正是这几种编码的混合出现才造成了我们遇到的字符编码的问题,如果只有一种就不会有这个难缠的问题了。关于字符编码的详细介绍可以看这位博主的文章传送门

环境:python 2.7.11


问题引出:

def foo(user,action=u'逛街'):
    print type(action)
    print '%sis%s' %(user,action)

if __name__ == '__main__':
    foo('小李')

这段程序抛出了如下的异常

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)
一开始以为在开头忘记声明了#coding:utf-8(#_*_ coding:utf-8 _*_与前面的不同只是这个比较好看一点),但是明明声明了,这就很奇怪了,修改程序。

def foo(user,action=u'逛街'):
    print type(action)
    print '%s' %(user)

if __name__ == '__main__':
    foo('小李')
这样就没问题了,也就是说只有两个一起出现的时候才有问题?仔细观察程序发现是action=u'逛街'的问题,既然开头声明了是utf-8,这里又使用unicode,那当然是有问题的了,utf-8对中文是三个字节表示,而uniocde是两个,这两种放在一起print函数取解码的时候当然会混淆了。把action=‘逛街’就可以了。两种编码统一了,就不会出问题了。但是追究根源为什么会写成action=u'逛街',原来是在命令行下测试脚本的一个小习惯。

python终端下的字符编码问题:


直接在终端下将一个中文串赋值给变量他的编码如上所示为'\xd6\xd0',在练习廖雪峰python3教程的时候有关于,encode和decode的部分,当时没有在意,使用当前的这个2.7版本练习的,总是在text.encode('utf-8')的时候却出现了问题。


原来python2的编码只有ascii和unicode两种,所有其他编码都要先转换成unicode码才能进行其他转换也就是说上面的'\xd6\d0'看起来是ascii其实是一种其他的编码,需要使用decode方法后,在进行编码。但是当前text的编码是什么难住我了。


求助type发现系统的内建函数没办法帮助我了,仔细思考后发现我在终端下输入的中文,肯定和终端有关系,我看了下终端的编码。


看到终端的编码是GBK我恍然大悟,原来这个中文是GBK编码,我按照GBK对他进行解码,也就是由GBK变成了unicode。


为了证明一下他确实是GBK,我又看了一下'中'的GBK编码是什么


没错了,就是GBK,现在就理解直接输入‘中’出现的编码是什么了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章