• Python学习基础笔记十一——编码


    计算机都是用数字来保存信息的。

    2使用10来表示。

    计算机可以通过二进制来表示数字。

    不同的使用场合,数字表示不同的意义:

    需要存储颜色信息的时候,使用不同的数字来表示颜色。

    如果我们要存储文字信息,也可以用不同的数字来表示不同的文字。

    字符集:

    语言符号用什么数字来表示。字符集就是语言符号和数字的对应关系。

    ASCII码,用数字表示文字符号的字符集,就称之为字符集。这是美国世界的。

    开始的时候,各个国家都定义有自己的字符集。

    中国定义了一套规范,规定了用什么数字代表什么样的文字符号。

    如GB2312、GBK、GB18030

    国际标准化组织定义了一个字符集,想包括世界上所有的文字符号。

    Unicode字符集。

    这个字符集里面包括了现今世界上的常用文字符号和对应的数字表示。

    这样就解决了在一篇文章中包含多国文字的问题了。

    字符编码:

    似乎一些问题都解决了,但是还有一个问题,就是字符是怎么存储和传输。

    最初只有ASCII的时候,一个字节256个字符,就可以存储任何文字。128个字符。

    软硬件对每个字符都是用字节(8位的二进制数)来进行存储、传输的,没有什么问题。

    但是在unicode里面,里面有10多万的文字符号,数字范围远远操作了一个字节所能代表的数字。

    所以一个字节不够。

    怎么用多个字节来表示这些数字呢?

    这就需要另外的规范,这些如何用字节表示字符对应的数字就是字符编码的规范。

    字节   对应   数字       字符编码。

    unicode字符编码,最常用的规范是UTF8和UTF16。

    不同的编码有不同的规范。不同的编码规范,对数字有不同的用字节表示的方法就行了。

    中文字符集gb使用另外的编码规范。

    python3的字符编码和解码:

    python3语言中的字符串对象是unicode字符串,在内存中实际存储的时候,使用的是utf16编码。

    utf16编码比较浪费空间。

    所以python语言要对字符串对象,进行存储和传输的时候,通常要使用字符串的encode方法,参数指定编码方式。编码为一个bytes对象。

    bytes对象的底层就是使用一个个的字节来存储字符串中的文字的。

    1. print ('你好'.encode('utf8')) # 输出 b'\xe4\xbd\xa0\xe5\xa5\xbd'
    2. print ('你好'.encode('gbk')) # 输出 b'\xc4\xe3\xba\xc3'

    输出内容中的b开头,表示这是一个字节串bytes对象。

    \x 说明是用16进制表示一个字节。

    encode方法把字符串encode编码,返回的是编码后的字节串对象bytes,就可存储到文件或者网络中去了。

    字节串解码:

    从文件中读到的文字信息、从网络上接受到的文字信息,获取的数据通常是使用某种字符编码后的字节串。

    程序通常是需要解码这些字节串字符串。这样才能方便程序理解和处理字符信息。

    python语言的解码,都是解码成unicode字符串对象。

    如果不小心写错了参数指定的编码方式,就可能返回错误的解码结果,出现乱码信息。

    1、Python编码解码:

    字符串到字节串(bytes),就是字符串编码。

    字符串(bytes)到字符串,就是字节串解码。

    2、ASCII编码:

    字符‘a’在ASCII码表中的对应的数据就是97,二进制为1100001。

    1. # 查看‘a’的ASCII编码
    2. print(ord('a'))
    3. # 转换为二进制数
    4. print(bin(ord('a')))
    5. # 将十进制数转为ASCII码
    6. print(chr(97))

    ASCII编码占用一个字节,也就是8位。2**8=256。ASCII编码覆盖了英文大小写、数字和特殊字符。

    3、GB2312

    《信息交换用汉字编码字符集》,中国大陆几乎所有的中文系统和国际化的软件都支持GB2312。

    基本集共收入汉字6763个核非汉字图形字符682个。整个字符集分94个区,每区有94位。每个区位上只有一个字符,因此可用所在的区和位来对汉字进行编码,称为区位码。

    把换成十六进制的区位码加上2020H,就得到了国标码。国标码加上8080H,就得到了常用的计算机内码。

    GB2312的出现,基本上满足了汉字的计算机处理需要,它所收录的汉字已经覆盖了中国大陆99.75%的使用率。

    对于人名、古汉语等方面出现的罕用字,GB2312不能处理,导致了GBK及GB18030汉字字符集的出现。

    01-09区为特殊符号。
    16-55区为一级汉字,按拼音排序。
    56-87区为二级汉字,按部首/笔画排序。
    10-15区及88-94区则未有编码。
    举例来说,“啊”字是GB2312之中的第一个汉字,它的区位码就是1601。

    4、GBK:即汉字的内码拓展规范。共收入21886个汉字和图形符号。

    5、GB18030:与GB2312-1980和GBK兼容,共收录汉字70244个,是一、二、四字节变长编码。

    6、Unicode:每种语言都有自己独特的编码,那么计算机在跨语言进行信息传输的时候,就无法沟通,出现乱码,于是Unicode编码就产生了。Unicode使用2-4个字节编码,已经收录了136690个字符。把所有语言统一到一套编码中,这套编码就是Unicode编码,使用Unicode编码是不会出现乱码问题的。

    Unicode使用两个字节表示一个字符,比较生僻的字符需要使用4个字符。

    缺点:用Unicode编码存储会比用ASCII编码多用一倍空间!存储和网络传输的时候一般数据会用得比较多。

    7、UTF编码:UTF编码将一个Unicode字符编码成1-6个字节。

    常用的英文字母被编码为1个字节。

    汉字通常是3个字节。

    生僻的字符会被编码为4-6个字节。

    说明:Unicode到UTF不是直接对应的,而是通过一些算法和规则转换的。

    7.1 UTF-8: 英文占用1个字节,欧洲语系占用2个字节,东亚占用3个字节,其他及特殊字符占用4个字节。

    7.2 UTF-16: 优先使用2个字节,否则使用4个字节表示。

    7.3 UTF-32:使用4个字节表示所有字符。

    1. print(list('常'.encode("utf-8")))
    2. [229, 184, 184]
    3. print(list('a'.encode("ascii")))
    4. [97]
    5. print(list('a'.encode("utf-8")))
    6. [97]
    7. print(list('a'.encode("gbk")))
    8. [97]

    我们可以看到,汉字是UTF-8的字符集中是3个字节,UTF-8 中亚是3个字节。而英文,无论采用哪种编码,都是一个字节,结果都是一致的。

    Pycharm编辑器默认采用的是UTF-8编码,并保存为UTF-8编码的文本文件。

    在Python3中所定义的字符串都是Unicode字符串,Unicode字符串可以编码为任意编码格式的字节码,解码时使用的同一编码解码即可得到原来的Unicode字符串。

  • 相关阅读:
    【IEEE出版丨EI检索】2024新型电力系统与电力电子国际会议(NPSPE 2024)
    通过低代码平台实现移动办公,轻量快捷方便
    好看又好用的办公好物,电脑手机都能打字,双飞燕剪刀脚键盘体验
    C进阶--数据的存储
    滴滴弹性云基于 K8S 的调度实践
    从白日梦到现实:推出 Elastic 的管道查询语言 ES|QL
    构建新纪元:Gradle中Kotlin插件的配置全指南
    剑指offer常见题 - 二叉树问题(三)
    万字总结——JavaScript简单入门【值得收藏】
    python反射
  • 原文地址:https://blog.csdn.net/chang_chunhua/article/details/128020862