码迷,mamicode.com
首页 > 其他好文 > 详细

该死的编码

时间:2018-01-30 21:22:52      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:gpo   sci   img   应用   类型   you   alt   多网站   mil   

最近几次项目都被Python的编码折磨的要死,今天好好的编码的知识总结一下:

   

先说python2

   

py2里默认编码是ascii

文件开头那个编码声明是告诉解释这个代码的程序 以什么编码格式 把这段代码读入到内存,因为到了内存里,这段代码其实是以bytes二进制格式存的,不过即使是2进制流,也可以按不同的编码格式转成2进制流, 如果在文件头声明了#_*_coding:utf-8*_,就可以写中文了, 不声明的话,python在处理这段代码时按ascii,显然会出错, 加了这个声明后,里面的代码就全是utf-8格式了。在有#_*_coding:utf-8*_的情况下,你在声明变量如果写成name=u"你好",那这个字符就是unicode格式,不加这个u,那你声明的字符串就是utf-8格式

   

再说python3

py3里默认文件编码就是utf-8,所以可以直接写中文,也不需要文件头声明编码了,你声明的变量默认是unicode编码,不是utf-8, 因为默认即是unicode了(不像在py2里,你想直接声明成unicode还得在变量前加个u, py3里,在your_str.encode("gbk")时,感觉好像还加了一个动作,就是就是encode的数据变成了bytes里,因为在py3里,str and bytes做了明确的区分,你可以理解为bytes就是2进制流,显示在程序中的不是010101这样的2进制, 那是因为python为了让你能对数据进行操作而在内存级别又帮你做了一层封装,否则让你直接看到一堆2进制,能看出哪个字符对应哪段2进制么。

这么讲吧, 无论是2还是三, 从硬盘到内存,数据格式都是 010101二进制到-->b‘\xe4\xbd\xa0\xe5\xa5\xbd‘ bytes类型-->按照指定编码转成你能看懂的文字

编码应用比较多的场景应该是爬虫了,互联网上很多网站用的编码格式很杂,虽然整体趋向都变成utf-8,但现在还是很杂,所以爬网页时就需要你进行各种编码的转换,不过生活正在变美好,期待一个不需要转码的世界。

   

这张图展示了字符串编码转换的过程

技术分享图片

Python3 默认的unicode 转入utf-8 格式,程序不光是解码到UTF8,还自动转成bytes类型。

s="你好"

s_to_utf8=s.encode("utf8","ignore")

print(s_to_utf8)

print(type(s_to_utf8))

技术分享图片

   

utf8 转为unicode,python3unicode就是str类型

utf8_to_unicode=s_to_utf8.decode("utf8","ignore")

print(utf8_to_unicode)

print(type(utf8_to_unicode))

   

技术分享图片

   

unicode 转为gbk

unicode_to_gbk=s.encode("gbk")

print(unicode_to_gbk)

print(type(unicode_to_gbk))

   

技术分享图片

   

可以看出,gbk格式在Python3中也是str类型

   

所以字符串转码必须经过unicode,不能用utf8直接到gbk,这就是编码和解码。

   

其他

msg = "我爱北京天安门" #默认就是unicode,python 文件是utf-8格式,但是所定义的变量字符串是unicode格式

#msg_gb2312 = msg.decode("utf-8").encode("gb2312")

msg_gb2312 = msg.encode("gb2312") #默认就是unicode,不用再decode,喜大普奔

gb2312_to_unicode = msg_gb2312.decode("gb2312")

gb2312_to_utf8 = msg_gb2312.decode("gb2312").encode("utf-8")

   

详细:http://www.cnblogs.com/yuanchenqi/articles/5956943.html

该死的编码

标签:gpo   sci   img   应用   类型   you   alt   多网站   mil   

原文地址:https://www.cnblogs.com/liuqianli/p/8387060.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!