首页 > Web开发 > 详细

给自己与初学者关于decode,encode的建议(啥utf-8,GBK)。

时间:2019-12-17 21:08:03      阅读:127      评论:0      收藏:0      [点我收藏+]

学了不少时间了,对于字符串的编码与解码总算有了一些认识。

记录一些自己的想法。

首先,在Python3里面,我们的str类型,相当于Python2的中unicode。

>>> name = ‘四店‘
>>> name
‘\xe5\x9b\x9b\xe5\xba\x97‘
>>> uname = name.decode(‘utf-8‘)
>>> print name
四店
>>> print uname
四店
>>> uname
u‘\u56db\u5e97‘
>>> type(uname)
<type ‘unicode‘>
>>> type(name)
<type ‘str‘>

 上面的是在python2中运行的结果,可以看到终端模式下,输入字符串对象只会出来对象的字节码数据,只有在print输出的时候,才出现对应的文字。

但在Python3中完全不一样了,py3的str就是py2的unicode

In [663]: name = u‘\u56db\u5e97‘                                                                                        

In [664]: name                                                                                                          
Out[664]: ‘四店‘

In [665]: uname = name.encode(‘utf8‘)                                                                                   

In [666]: uname                                                                                                         
Out[666]: b‘\xe5\x9b\x9b\xe5\xba\x97‘

In [667]: print(name)                                                                                                   
四店

In [668]: print(uname)                                                                                                  
b‘\xe5\x9b\x9b\xe5\xba\x97‘

 在这里可以看到,我们赋值给name的unicode的字符标识,但无论是终端还是print输出,name一直是四点了。

name明显是str模式,所以证明了前面说的。

 

后面流畅的Python我会记录自己的更加详细对与解码,编码的理解。

 

其实想通了感觉也就那么回事,网上好多资料,基本都是一大抄。

 

我最后稍微总结一下。unicode就是一份超级大字典,全世界所有的文字都有,所以Python终端显示用unicode蛮好

但unicode的对应表,很多人觉的传输数据的时候不好,就搞出来了utf-8,utf-16,utf-32,这个也是一份映射表。

假如在unicode里面,每个文字的名字相当与码位,utf-8,utf-16就好比编号。

比如"好"的unicode为u‘\u597d‘,utf-8为‘\xe5\xa5\xbd‘

这个一对一对应的,就是说,unicode里面的每一个字符都可以找到utf-8的对应字节序(通俗讲就是编号)。

所以大家应该用utf-8。

 

再来说一些地方与国家的编码,比如中国的gbk,gbk包含了全部的中国字与字节码的映射关系,可以想象成这是一本,中国的地方字典。

In [669]: name                                                                                                          
Out[669]: ‘四店‘

In [670]: bytes(name,encoding=‘gbk‘)                                                                                    
Out[670]: b‘\xcb\xc4\xb5\xea‘

 当我们在encode的时候,首先先拿gbk对照表里面的字来对比需要解码的字,比如第一个四字,找到了它的序号为\xcb\xc4,然后对编号进行输出。

所以这个很容易造成问题,你如果给一个他字符集没有的字,找了老半天才找到。

In [679]: ‘\u20ac‘.encode(‘gbk‘)                                                                                        
---------------------------------------------------------------------------
UnicodeEncodeError                        Traceback (most recent call last)
<ipython-input-679-90f6ff568b6b> in <module>
----> 1 ‘\u20ac‘.encode(‘gbk‘)

UnicodeEncodeError: ‘gbk‘ codec can‘t encode character ‘\u20ac‘ in position 0: illegal multibyte sequence

In [680]: ‘\u20ac‘                                                                                                      
Out[680]: ‘€‘

 就报错了,话说gbk的字符集还是蛮厉害了,输入了日本字,意大利的字,基本都有。

但对于utf-8只要是unicode的字符,他都能编码

In [680]: ‘\u20ac‘                                                                                                      
Out[680]: ‘€‘

In [681]: ‘\u20ac‘.encode(‘U8‘)                                                                                         
Out[681]: b‘\xe2\x82\xac‘

 所以再次推荐大家以后都用utf-8这样的话,以后里面的decode,encode的ignore参数都可以不用了。

 

 

这里还有一份老外写的参考链接:https://pycoders-weekly-chinese.readthedocs.io/en/latest/issue5/unipain.html

还行吧,反正我没咋看懂,应该有很多py2的说明,py2基本没啥节操过。

给自己与初学者关于decode,encode的建议(啥utf-8,GBK)。

原文:https://www.cnblogs.com/sidianok/p/12056563.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!