美文网首页
python 编码问题

python 编码问题

作者: Manchangdx | 来源:发表于2018-06-15 10:05 被阅读0次

    1、一些概念

    • 比特 / bit:计算机中最小的数据单位,是单个的二进制数值 0 或 1
    • 字节 / byte:计算机存储数据的单元,1 个字节由 8 个比特组成
    • 字符:人类能够识别的符号
    • 编码:将人类可识别的字符转换为机器可识别的字节码 / 字节序列,反向过程叫解码
    • 概述:
      Unicode 是人类可识别的字符格式
      ASCIIUTF-8GBK 等都是机器可识别的字节码格式
      我们写在文件中的 py3 代码,是由字符组成的,它们的格式,就是 Unicode
      而字符是以字节为存储单位保存在文件中,文件保存在内存 / 物理磁盘中

    2、编码格式

    Python2 的默认编码是 ASCII,不能识别中文字符,需要显式指定字符编码
    Python3 的默认编码为 Unicode,可以识别中文字符

    编码格式 字节数 说明
    ASCII 1 只有数字、大小写字母和几个标点符号
    Unicode 2 / 4 把所有语言统一编到一套编码里,避免乱码
    UTF-8 1 - 6 Unicode 进化而来,避免浪费空间

    计算机内存中的数据,统一使用 Unicode 编码
    数据传输或保存到硬盘上,使用 UTF-8 编码

    3、编码和解码

    • 编码 / encode:将 Unicode 字符串转换为特定编码格式对应的字节码的过程
    • 解码 / decode:将特定编码格式的字节码转换为对应的 Unicode 字符串的过程
    In [43]: '美丽人生'.encode('gbk')
    Out[43]: b'\xc3\xc0\xc0\xf6\xc8\xcb\xc9\xfa'
    
    In [44]: b'\xc3\xc0\xc0\xf6\xc8\xcb\xc9\xfa'.decode('gbk')
    Out[44]: '美丽人生'
    
    In [45]: '美丽人生'.encode('utf-8')
    Out[45]: b'\xe7\xbe\x8e\xe4\xb8\xbd\xe4\xba\xba\xe7\x94\x9f'
    
    In [46]: b'\xe7\xbe\x8e\xe4\xb8\xbd\xe4\xba\xba\xe7\x94\x9f'.decode('utf-8')
    Out[46]: '美丽人生'
    
    In [47]: b'\xc3\xc0\xc0\xf6\xc8\xcb\xc9\xfa'.decode('gbk').encode('utf-8')
    Out[47]: b'\xe7\xbe\x8e\xe4\xb8\xbd\xe4\xba\xba\xe7\x94\x9f'
    

    上面这种以 b 开头的就是字节码,一个斜杠就是一个字节
    可见,一个常用汉字用 GBK 格式编码后占 2 个字节,用 UTF-8 格式编码后占 3 个字节
    因为存储或传输时,也用UTF-8 编码,所以一个汉字占的空间就是 3 个字节
    字符串长度和字节码长度:

    In [61]: len('美丽人生')
    Out[61]: 4
    
    In [62]: len(b'\xe7\xbe\x8e\xe4\xb8\xbd\xe4\xba\xba\xe7\x94\x9f')
    Out[62]: 12
    

    4、Python3 的默认编码

    • 例如我们用编辑器打开一个文件,输入 a,这个 a 就是 Uincode 字符
      当我们保存文件,这个字符就会根据编辑器的设置
      被转换为对应的编码格式的字节码保存到系统硬盘
      这是一个 encode 过程
    • Python 解释器执行文件时
      先将文件字节码按照指定的编码格式解码为字符,然后运行程序
      这是一个 decode 过程
    • 指定编码,在文件开头,例如
      Python 文件通常这样写:# -*- coding:utf-8 -*-
      HTML 文件通常这样写:<meta charset='utf-8'>
      意思就是该文件是 UTF-8 编码格式,按这个格式解码
    • 上文提到 Python3 的默认编码是 UTF-8
      即如果文件未标明编码格式,解释器会自动按照 UTF-8 来解码
      当解释器无法通过指定的或默认的编码格式对文件进行转换 / 解码时
      就会出现解码错误:UnicodeEncodeError

    相关文章

      网友评论

          本文标题:python 编码问题

          本文链接:https://www.haomeiwen.com/subject/msepeftx.html