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


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

    记录一些自己的想法。

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

    >>> name = '四店'
    >>> name
    'xe5x9bx9bxe5xbax97'
    >>> uname = name.decode('utf-8')
    >>> print name
    四店
    >>> print uname
    四店
    >>> uname
    u'u56dbu5e97'
    >>> type(uname)
    <type 'unicode'>
    >>> type(name)
    <type 'str'>
    

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

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

    In [663]: name = u'u56dbu5e97'                                                                                        
    
    In [664]: name                                                                                                          
    Out[664]: '四店'
    
    In [665]: uname = name.encode('utf8')                                                                                   
    
    In [666]: uname                                                                                                         
    Out[666]: b'xe5x9bx9bxe5xbax97'
    
    In [667]: print(name)                                                                                                   
    四店
    
    In [668]: print(uname)                                                                                                  
    b'xe5x9bx9bxe5xbax97'
    

    在这里可以看到,我们赋值给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为'xe5xa5xbd'

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

    所以大家应该用utf-8。

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

    In [669]: name                                                                                                          
    Out[669]: '四店'
    
    In [670]: bytes(name,encoding='gbk')                                                                                    
    Out[670]: b'xcbxc4xb5xea'
    

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

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

    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'xe2x82xac'
    

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

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

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

    前面写的我就不删除了,从流畅的Python书中指出,Python内置100多种字符编码。

    我的理解就是,当给你一个字符假如是"我",Python的100多种解码器中能找到"我"的对应的字节序列是不一样的。

    你通过编码的方式把unicode中的"我"转换成字节序列,可以是2字节,也可能是3字节。

    可以用于计算机的存储,或者网络的传输,但机器看的懂的,人看不懂,当需要人看的时候,你又需要用同样的方式把机器的字节序列装换成人看的懂的。

    这个就是解码。你用什么编码的,就必须用什么解码,其实有了utf8,另外的编码方式真的应该淘汰了。

    解码以后就是unicode了,你可以把unicode想象成就是文字。

    但unicode变成文字是在哪里实现,又是如何实现的,网上的资料比较少。所以我只能把unicode想象成文件了,

    因为你编码的时候就是对unicode进行编码。

  • 相关阅读:
    当我们谈线(进)程“切换”时
    机器学习算法实现——线性回归
    从cpu加电到加载OS内核的详细过程(清华大学ucore-lab1总结一)
    X86 I/O端口
    【转】实模式和保护模式
    链接器(linker)的作用——CSAPP第7章读书笔记
    【转】Derivation of the Normal Equation for linear regression
    使用PowerShell创建Active Directory用户对象(域用户)
    使用Powershell安装WSFC
    临时自定义数学算符添加正下方下标
  • 原文地址:https://www.cnblogs.com/sidianok/p/12056563.html
Copyright © 2020-2023  润新知