python 中 编码

编码简史


编码就是将人类识别的字符转计算机可以识别的二进制 及逆向的过程

  1. ascii 码

    • 计算机最早由美国人发明,他们本身没有太多符号需要编译

    • 设计 8 位 256 种可能就可以完全够用

    • 8位一个字节,所以 ascii 码是一个单字节编码表

    • 里面没有中文和其它国家的符号,所以计算机推广到全世界后不能通用

  2. gb2312: 中国基于自已的语言设计的一种编码方式,不能涵盖所有的汉字

  3. ......

  4. unicode

    • 如果每个国家都采用自已的编码,不利于信息的传播,如此产生了 万国码

    • 规定 四个字符存储一个符号

    • 英文本身只需一个字节就够,所以这种编码在存储文件时会造成大量的空间浪费

  5. utf8

    • 类似的有 utf32 utf16 ,都可以认为是 Unicode 的升级,变长存储

    • 定义一个英文按1个字节,一个中文按3个字节

python 中的编码


  • 在 python3 中字符是以 Unicode 存储于内存中的

  • unicode 定长存在于内存中,便于寻址查找,提高速度

  • 因为 Unicode 可能存在空间 “浪费”,所以写入硬盘中的内容是 bytes

  • 支持 bytes 的编码有 Utf8 gbk 等【非unicode】

  • 综上所述:

    • 文件内容读取到内存中时 需要 decode 为 unicode

    • 内存中的文件写入到硬盘时 需要 endcode 为 bytes

python里的 open 方法


01 read模式

 f = open("***", "r", endcoding="编码位")
 # 不要纠结是 open 还是 with open ,还没写 close 呢
  • 常见问题: 如果不指定 encoding 时会报 gbk can not decode byte.....

  • 思考:

    • 上述现象一定是编码问题

    • 需要确认当前 project 编码,一般 pycharm 新建工程默认都是 utf8

  • 结论:

    • 被打开的文件如果在项目中新建,那么一定是 utf8 编码,可以查看字节数确定

    • 被打开文件内容读取到内存中时一定要先 decode 为 unicode

    • 如果不指定被打开文件中的 bytes 是何种编码规则那么 windows 系统默认会采用 gbk

    • 就是说我们有一段 utf8编码规则的 bytes 正在被 gbk规则进行 decode ,所以会报错

  • 解决:指定 encoding="utf8"

02 write模式

 f = open("***", "写模式", endcoding="编码位")
  • w 写模式:

    • 此时写入的内容必须是 str 类

    • 之前讨论过 写入硬盘时必须是 bytes 类型,所以要将 unicode 进行 encoding

    • 基于当前项目默认编码,在 w 之前要设置 encoding 为 utf8

  • wb 写模式:

    • 此时写入的内容必采是 bytes 类

    • 此时一定不要设置 encoding 因为,在写入之前已经将 str encode 过

    • 不要纠结 wb 之后的文件使用编码打开时为什么显示为可视字符而非 二进制,因为编码器自已采用合适的编码处理过了

posted @ 2019-04-11 10:56  麻团boy  阅读(211)  评论(0编辑  收藏  举报