zoukankan      html  css  js  c++  java
  • python2/python3 编码问题

    1、编码解码

    1.1、概念

    • 比特 / bit:计算机中最小的数据单位,是单个的二进制数值 0 或 1

    • 字节 / byte:计算机存储数据的单元,1 个字节由 8 个比特组成

    • 字符:人类能够识别的符号

    • 编码:将人类可识别的字符转换为机器可识别的字节码 / 字节序列

    • 解码:编码的反向过程叫解码

    • 概述:Unicode 是人类可识别的字符格式;ASCIIUTF-8GBK 等都是机器可识别的字节码格式。我们写在文件中的 py3 代码,是由字符组成的,它们的格式,就是 Unicode,而字符是以字节为存储单位保存在文件中,文件保存在内存 / 物理磁盘中

     

    1.2、编码格式

    ASCII:计算机就可以使用127个不同字节来存储英语文字

    GB2312:前面一个字节为高字节(0xA1-0xF7),后面一个字节为低字节(0xA1-0xFE),可以表示7000多个汉字;是对ASCII的中文扩展

    GBK:GB2312扩展后的编码成为GBK, GBK包括了GB2312的所有内容,同时增加了近20000个新的汉字(包括繁体)和符号

    Unicode:Unicode 用两个字符来表示一个字符,可以提供65535种字符,足够覆盖世界上的所有符号

    utf-8:一种针对Unicode的可变长度字符编码,可以使用1-4个字节表示一个符号,根据不同的符号变化字节长度,当字符在ASCII编码范围时,用一个字节表示,兼用ASCII

    Unicode和utf-8的关系:Unicode是内存编码表示方案(规范),而utf-8是如何保存和传输Unicode的方案(实现)


    2、Python2/Pyhon3中的String编码

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

    Python3 的默认编码为 Unicode,可以识别中文字符

    计算机内存中的数据,统一使用 Unicode 编码

    数据传输或保存到硬盘上,使用 UTF-8 编码

     python2python3
    str a sequence of bytes a sequence of code points (unicode)
    unicode a sequence of code points (unicode) ——
    bytes —— a sequence of bytes

    python3中的bytes等于python2中的str,是机器识别的字节码对应utf-8编码,只能进行 decode 解码;

    python3中的str等于python2中的unicode,是人识别的字符串对应unicode编码,只能进行 encode 编码;

     

    Python2中有隐式转换,Python3中没有;

    隐式转换:Python2 掩盖掉了 byte 到 unicode 的转换,只要数据全部是 ASCII 的话,所有的转换都是正确的,一旦一个非 ASCII 字符偷偷进入你的程序,那么默认的解码将会失效造成 UnicodeDecodeError 的错误。


    3、编码问题

    • python3中分清是str 还是 bytes;python2中分清是str还是unicode;

    • 确定字符集是否包含当前字符的编码,如ASCII不能encode中文字符;

    • 确定编码解码方式一致;


    4、参考引用

    https://zhuanlan.zhihu.com/p/38293267

    https://www.jianshu.com/p/5682a0e0a9ba

    https://blog.csdn.net/hjxzb/article/details/81842747

    https://nedbatchelder.com/text/unipain/unipain.html#1

    https://zhuanlan.zhihu.com/p/33220501

  • 相关阅读:
    软件测试工具
    nat 转发
    修改Oracle 10g Express Edition的字符集
    java数字证书学习笔记
    【Java–XML】JDOM解析XML字符串(非XML文档)
    JAVA Web快速开发部署(Javarebel实现真正高效的tomcat热部署)
    热天稀饭配方
    javascript 使用正则实现replaceall功能
    设置eclipse中各类型文件的默认浏览器(如设置flex的.mxml的编辑器为MXML Editor)
    GAE中JDO数据清除
  • 原文地址:https://www.cnblogs.com/GO-NO-1/p/12976608.html
Copyright © 2011-2022 走看看