关于pyhton2.x中编码问题的一点小理解

欢迎访问个人博客:blog.spursgo.com

关于pyhton2.x中编码问题的一点小理解

大约在一年前,当时接触pyhton爬虫时(那时还是在Windows上开发学习),由于网页中存在大量中文,自然不可避免的会涉及到编码问题。刚刚入门就遇到了python中的一个大麻烦:编码问题,查了一些资料把手上的问题解决之后,就没有去管编码问题了。

一年后,仍然习惯于python2.x。本来在macOS和ubuntu上写得很顺利得一个爬虫程序,转到windows 10上居然出现了大量的乱码。


当时真的很郁闷,为什么在其他操作系统上运行好好的程序,到Windows上就成这样了呢?郁闷归郁闷,问题还是要解决呀!

于是乎,又开始和pyhton编码问题打交道了。因为现在养成了写博客的习惯,所以本次探究python编码问题的过程我就详细记录了下来,以便以后再次遇到这个问题,可以很快的查看而不需要再次折腾。

各个击破

1. Windows命令行的编码

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

这是我程序中对pyhton脚本默认编码的处理,python默认的本来是ascii编码,这里我改为了utf-8。

因此,如果我在程序执行这么一句:

print " "*25 + "〓个人博客:blog.spursgo.com〓"

那么,打印出来的这句话就是默认采用utf-8编码格式,嗯哼,难道有什么不对吗?
别忘了,我们还不知道Windows命令行窗口采取的编码格式呢!
好的,赶快查阅一下!

右击命令行窗口标题栏--选择属性--点击选项,之后我们会看到GBK的字样:


2. 编码格式介绍

哦,原来如此,我打印的是utf-8编码格式,但是他却采用gbk编码格式,命令行窗口当然不能正常显示喏!

可能你觉得对python的各种编码格式不是很了解,没关系,网上有很多介绍编码格式的文章,这里我推荐两篇:

在Python中正确使用Unicode 这篇侧重介绍在python中正确使用编码

Python字符编码详解 这篇侧重介绍编码格式

看完这两篇文章后,相信你会对pyhton中的编码会有很深刻的认识。
这里,主要记录一下我个人的一些理解和实验操作:

2.1 python中的字节串和字符串

对java比较了解的同学,应该会知道在java中不需要严格区分所谓的字节串和字符串,java这门语言把编码问题处理的非常好!
但是,在python2.x中,这两个概念却是一定要理解的,不然各种编码问题可能就会找上门来。
以下概念来自于自己的理解,可能不是很严谨。
字节串:以字节为单位,它的每一个个体是字节,因此我们统计字节串的长度时,结果一定是所有字节的数量。

字符串:以字符为单位,它的每一个个体是字符,因此我们统计字符串的长度时,结果一定是所有字符的数量。

咦!怎么两句话好像差不多? 是的,我们要区分的就是字符和字节:一个字符可以包含多个字节。

说了这么多,还是来验证一下吧:

len.png

从图片中,我们可以可以清楚的看到,一个‘人’字,由于它的类型不一样,当我们取长度时,得到的结果不一样。
现在是不是对字节和字符有了更好的认识了呢?

3. 编码格式的互相转换

decode :解码,实现其他编码格式到unicode的转换
encode :编码,实现unicode到的转换其他编码格式

常见的其他编码格式:utf-8,gbk,gb2312

这是有一个问题我们一定要重视:decode既然是其他编码格式到unicode的转换,达到解码的目的,也就是说unicode本身不是一种编码格式。因此,我们在进行编码与解码的时候,我们要弄清楚,这个被操作的对象是谁?否则,出现编码问题的几率会大大增加。

4. unicode的深刻理解

unicode实际上是一种字符集,神奇之处在于所有语言的字符都用这一种字符集来表示,它是全人类都承认的一种统一标准。unicode映射了各种字符应该用哪种方式来表示,而没有指明具体的传输和储存方式,这个工作是由utf来完成的,如utf-8,utf-16。

5. 编码解码前后的差别

一个str类型的字节串解码后就成了unicode的字符串,相反,一个unicode类型的字符串解码后就成了str的字节串。
以下是我的实验代码:

#coding:utf-8

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

country = '中国'
print type(country)
print country
country = country.decode('utf-8')
print type(country)
print country
country = country.encode('gbk')
print type(country)
print country

下面是执行结果:

class.png

实验结果很好的验证了刚刚的结论。

6. 建议

6.1 更改文本编码格式

#coding:utf-8

6.2 更改程序默认编码格式

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

6.3 尽可能的采用unicode作为过渡,输出时编码为需要的编码格式

文/浅斟低唱

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容