zoukankan      html  css  js  c++  java
  • python2.7.x的字符串编码到底什么鬼?(中文和英文的处理)

    一直以来我其实一直对python的编码弄得非常晕,能正常编码,也能处理一些情况。但是始终不明白有些问题究竟为何出,原因是什么,为什么要这样用。

    今天晚上正好好好研究了一番解答了自己心中的困惑。

    Q:python2.7.x里面的中文表示到底是什么鬼?

    A:直接来看看

    In [23]: x = '好不好喝都要喝'
    
    In [24]: x
    Out[24]: 'xe5xa5xbdxe4xb8x8dxe5xa5xbdxe5x96x9dxe9x83xbdxe8xa6x81xe5x96x9d'

    这个x打印值相信熟悉编码的盆友都知道,这是utf-8编码。也就是说python2.7.x 在默认情况下将中文默认转到了utf-8编码。

    这里type(x)得到结果是str

    Q:python2.7.x里的unicode究竟什么鬼?

    A:还是通过例子来看看

    In [16]: x = u'好不好喝就很好喝'
    
    In [17]: type(x)
    Out[17]: unicode

    在2.7.x在中,u写在字符串前面将会将一个字符串转成unicode对象。

    Q:python2.7.x中unicode可以和str相加吗?

    A:还是来看例子

    In [62]: z = '好不好喝'
    
    In [63]: x = u'好不好喝都要喝'
    
    In [64]: z+x
    ---------------------------------------------------------------------------
    UnicodeDecodeError                        Traceback (most recent call last)
    <ipython-input-64-f964ff206363> in <module>()
    ----> 1 z+x
    
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)

    熟悉的报错,可见在python2.7.x中,unicode中文和utf8中文是不能相加的因为是不同类型。

    Q:那么英文字符串可以相加吗?

    A:可以。具体就不掩饰了大家可以自己试试。而且最终得到的结果会被转成全unicode

    这两个库在对无论utf8还是unicode对象进行中文编码的时候,都会将内容转成unicode再编码。最后你拿到结果decode之后就变成了unicode对象,想要再拿到utf8对象,就需要再encode一次才可以了。

    一不注意就踩坑。

  • 相关阅读:
    LeetCode 275. H-Index II
    LeetCode 274. H-Index
    LeetCode Gray Code
    LeetCode 260. Single Number III
    LeetCode Word Pattern
    LeetCode Nim Game
    LeetCode 128. Longest Consecutive Sequence
    LeetCode 208. Implement Trie (Prefix Tree)
    LeetCode 130. Surrounded Regions
    LeetCode 200. Number of Islands
  • 原文地址:https://www.cnblogs.com/piperck/p/5460416.html
Copyright © 2011-2022 走看看