• python 中的unicode详解


    通过例子来看问题是比较容易懂的。

    首先来看,下面这个是我新建的一个txt文件,名字叫做ivan_utf8.txt,然后里面随便编辑了一些东西。 

    然后来用控制台打开这个文件,同样也是截图:

    这里就是简单的打开文本,读取文本内容,打印出来看,我们看到print出来的是和我写进去的是一样的东西。然后呢,我在对这个内容使用decode(‘gbk’),就是解编码,使用gbk方式进行解码,什么意思呢?就是说,我假设这个a是gbk方式的编码,结果是什么呢?大家都看到了,报错了哈!!!!说明这个不是gbk编码,是的,我的编码是utf-8编码,当然要报错啦。。。其实主要是这个里面的中文无法识别,如果只有英文应该还是不会报错的,虽然解出来内容是变样了哈。。。

    回到我们这个问题,这个报错是什么意思呢?

    这就是牵扯到我们今天要讲的问题了,看完我讲完的内容就能够知道是为什么了。。。

    1.python字符串的本质是什么呢?

    2.unicode的神奇之处在哪里?

    3.python2是怎样处理unicode编码的?

    4.python3是怎样处理unicode编码的?

    1.为什么python用unicode编码呢?

    主要有:

    1.处理非英文的内容;

    2.可以使用第三方库;

    3.接受任何的输入内容;

    在网页应用和数据库的交互以及命令行脚本处理都可以用到python。

    上面这个报错的例子就是命令行脚本的例子。

    大家都知道,其实就是一串字节流(1byte:字节),一个字节就是8位二进制数,10进制的8位是千万,这个二进制的8位就叫做1个字节。1个二进制位只能够表示0或者1。所以1个字节可以表示2的8次方种可能。扯远了。。。。。。。

    我们这个字符串时utf-8编码方式编码的。什么叫编码方式呢?就是说这么一串01010101010101……是按照什么样的规则转换成字符的,为什么显示出来会像我们看到的一样?

    utf-8就是其中一种规则。

    unicode编码每一个字符占两个字节,也就是16个bit位咯!!!如果是其他编码的话,这16bit位可能表示的别的内容。

    如今python标准库已经支持100多种编码方式了。

    我们不用print,直接a就会看到原始的内容:’sdfsxe5xaexb6xe9x87x8cxe5x8fx91xe7x94x9fxe7x9ax84xe7xbaxa0xe7xbaxb7'

    这个就是在内存中的表示方式,前面的英文可以显示出来,后面的因为是中文,不能够直接翻译出来,人家也不会嘛。。。这些都是16进制,4个2进制只需要1个16进制咯。

    utf-8是asciil编码的一种扩展。每个字符是一个字节。所以一个有2的8次方 (2的平房为4,4次方为16,6次方64,8次方就是256),因为是256种可能。但是为什么标准教程上说是128呢?这个等我回去查一下资料再说吧。。可能是ascii库只有128种字符,还有一半的就浪费了哦。

    非英文的就不能用ascii来编码,比如说:d = ‘廖’,然后d.encode(d),这样就会爆下面的错:

    >>> d.encode('ascii')

    Traceback (most recent call last):

      File "<stdin>", line 1, in <module>

    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)

    在python中:类型关系如下:

    <type 'basestring'>

      |

      +--<type 'str'>

      |

      +—<type’unicode'>

    对字符串a使用decode(encoding)就会得到unicode类型,a为unicode类型的时候a.encode(encoding)就会得到str类型了。

    >>> print a

    sdfs家里发生的纠纷

    >>> len(a)

    25

    >>> a[-1]

    ‘xb7'

    >>> a_uni = a.decode('utf-8')

    >>> a_uni

    u'sdfsu5bb6u91ccu53d1u751fu7684u7ea0u7eb7'

    >>> type(a_uni)

    <type 'unicode'>

    >>> len(a_uni)

    11

    >>> a_uni[-1]

    u’u7eb7'

    unicode是:

    一种不用字节的形式来表示文本;就是说是变长的,len就是个数。

    每次中语言的每一个字符都有唯一的数字来表示。

    支持所有主流的语言;

    可以表示超过100万的符号;

    如果ascii, utf-8 和其他的字节串 是文本,那么unicode就是文本性的,unicode时最严格的文本格式;unicode是最严格的。这是文字的抽象格式。

    unicode是一种概念:

    为unicode保存到硬盘,就必须进行编码

    >>> a = unicode('AB')

    >>> type(a)

    <type 'unicode'>

    >>> a.encode(‘utf-8’)#这就是编码成了utf-8编码了。

    'AB'

    utf-8

    就是变量的多字节表示。

    前128个字符就和ascii一样。(其他的1字节表示不了,需要更多字节,一个字符可能需要1-4个字节)

    >>> a = unicode('AB')

    >>> a.encode('utf-16')

    ‘xffxfeAx00Bx00’

    utf-16

    多字节表示。

    2-4个字节表示一个字符;

    是对2个字节范围内的字符举行优化;

    utf-32

    固定宽度的字符,最快

    4个字节32位表示一个字符;

    python不支持

    解码文字转换为unicode

    大多数情况都是自动的。

    这种情况主要发生在第三个库。

    python会为你解码的。

    往一个ascii编码格式的文件里写入unicode编码的文字时会报错的。

    如果要写,可以先将字符a.encode(sys.getdefaultencoding())

    python2的默认方式是ascii

    可以用:sys.setdefaultencoding(‘utf-8’)来设置python的编码方式。这个设置当次有效。

    但是设置会有更多的麻烦。

    解码:

    1.解码

    2.unicode编码无处不在

    3.编码

    转换为unicode:

    def to_unicode_or_bust(obj, encoding = ‘utf-8’):

    if isinstance(obj, basestring):

    if not isinstance(obj, unicode):

    obj = unicode(obj, encoding)

    return obj

    转换为str类型:

    主要用在写入磁盘活着print出来的时候:

    直接encode(encoding)即可。

    open文件指定编码方式,在第三个参数:

    f = open(’1.txt’, ‘r’, encoding = ’utf-8’)

    content = f.read()

    f.close()

    这样就是utf-8的方式读了。写也是一个道理。

  • 相关阅读:
    记录美好生活:
    _2data=data.find_all(class_='cvesummarylong')#获取在srrowns里面没有的那个数据
    _1data=data.find_all(class_='srrowns')#获取所有以srrowns为标签的数据
    idea is good
    创业基础(第六章:创业资源及其管理) 来自高校:全国大学生创新创业实践联盟 分类:创新创业 学习规则:按序学习
    创业基础(第四章: 创业风险及识别与管理) 来自高校:全国大学生创新创业实践联盟 分类:创新创业 学习规则:按序学习
    hdu6447 YJJ's Salesman
    hdu6438 Buy and Resell
    论开学第二个月干了点啥
    论开学第一个月干了点啥
  • 原文地址:https://www.cnblogs.com/hackerl/p/4963642.html
Copyright © 2020-2023  润新知