zoukankan      html  css  js  c++  java
  • python中的字符串和编码

    了解编码之前首先说下这几个词的概率:

    位、字节、字符、字符串

      1、位(bit)也称为比特

        这个其实很简单,因为计算机都是二进制存储数据,也就是0和1,一个0或者1就表示一位。这是计算机存储的最小单位。

      2、字节(bytes)

        一个字节由8位组成,00000000到11111111 如果第一位不做符号位,那么一个字节能表示的整数范围:0-255。我们平常的网络传出信息,都是转换为字节进行传输的。

      3、字符

        比如 'a'或者'b'这就表示一个字符a 一个字符b。

      4、字符串

        至少两个字符就组成了字符串,比如:'123456aa'。

    有了上面这些了解,就可以正式说说编码的问题:

      ASCII编码:(一个字节)

        由于计算机是美国人发明的,他们最初只考虑了他们自己语言,所以他们就只把字母、数字、特殊符号总共127字符编码进了计算机,形成了ASCII编码表。

        由于字符比较少,只用了一个字节,就能存储所有的字符:二进制从0000 0000 到 0111 1111    十进制 0-127

        ASCII值:数字的ASCII码<大写字母的ASCII码<小写字母的ASCII码。

        查询ASCII技巧,方便查询ASCII码对应的字符:新建一个文本文档,按住ALT+要查询的码值(注意,这里是十进制),松开即可显示出对应字符。例如:按住ALT+97,则会显示出'a'。

      GB2312编码:(两个字节)

        我们也把所有的汉字编码进了计算机,由于汉字很多而且不能与ASCII编码冲突,所以一个汉字至少需要两个字节来编码。

        但这里就出现问题了,那么多个国家,那么多语言,没有标准,各自编码进去,肯定会很混乱。

      Unicode编码:(至少两个字节)

        Unicode编码就是为了 解决语言混乱问题而出现的,Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。由于语言众多,至少都要两个字节,并且为了兼容以前的老程序,ASCII里面字符对应的编码不用变,只需要前面加8个0凑成两个字节就够了。

      虽然这样统一了,可以解决乱码问题,不过却存在存储资源的浪费。如果一篇文章全是英文写的,以前只要1K,现在就得2k,存储空间浪费太多。

      UTF-8编码:(1-6个字节)可变长编码

       utf-8就在unicode上进行了升级。常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节,这样如果是全英文的就大大节省空间。

      在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。

      用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:

    字符ASCIIUnicodeUTF-8
    A 01000001 00000000 01000001 01000001
    x 01001110 00101101 11100100 10111000 10101101

      对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符:这里的整数都是对应该字符再Unicode中的编码

      ord('A')   #65

      ord(‘中’)#20013

      chr(20013)  #'中'

      

      由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes

      Python对bytes类型的数据用带b前缀的单引号或双引号表示:

      x = b'ABC'
    

      注意区分'ABC'b'ABC',前者是str,后者虽然内容显示得和前者一样,但bytes的每个字符都只占用一个字节。

      以Unicode表示的str通过encode()方法可以编码为指定的bytes,在bytes中,无法显示为ASCII字符的字节,用x##显示,例

    >>> 'ABC'.encode('ascii')
    b'ABC'
    >>> '中文'.encode('utf-8')
    b'xe4xb8xadxe6x96x87'

      如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法: 

    >>> b'ABC'.decode('ascii')
    'ABC'
    >>> b'xe4xb8xadxe6x96x87'.decode('utf-8')
    '中文'
  • 相关阅读:
    Vue.Js(html5) + Java实现文件分片上传
    进程、线程基础知识全家桶,30 张图一套带走
    20 张图揭开「内存管理」的迷雾,瞬间豁然开朗
    面试官:换人!他连 TCP 这几个参数都不懂
    TCP 半连接队列和全连接队列满了会发生什么?又该如何应对?
    实战!我用 Wireshark 让你“看得见“ TCP
    IP 基础知识全家桶,45 张图一套带走
    写了Bug,误执行 rm -fr /*,我删删删删库了,要跑路吗?
    你还在为 TCP 重传、滑动窗口、流量控制、拥塞控制发愁吗?看完图解就不愁了
    硬不硬你说了算!35 张图解被问千百遍的 TCP 三次握手和四次挥手面试题
  • 原文地址:https://www.cnblogs.com/myIvan/p/9636159.html
Copyright © 2011-2022 走看看