前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 编码问题详解

Python 编码问题详解

原创
作者头像
ruochen
修改2021-07-22 14:19:53
55.6K0
修改2021-07-22 14:19:53
举报

编码问题

  • 为什么需要编码问题
代码语言:txt
复制
- 本质上计算机只能识别01代码
代码语言:txt
复制
- 如何用一长串01代码表示复杂的信息
  • 编码简史
代码语言:txt
复制
- 二进制
代码语言:txt
复制
    - bit: 一个0或者1的二进制数字
代码语言:txt
复制
    - byte: 八个01代码,字节
代码语言:txt
复制
- 第一阶段: ASCII
代码语言:txt
复制
- 第二阶段:百花齐放, GB2312, GBK, BIG5, Latin1,JIS, 
代码语言:txt
复制
    - Latin1:兼容欧洲大多数语言
代码语言:txt
复制
    - 中国:GBxxxx
代码语言:txt
复制
    - 韩国台湾: BIG5
代码语言:txt
复制
    - 日本: JIS
代码语言:txt
复制
    - ANSI-MBCS(Multi-bytes charecter set,多字节字符集)
代码语言:txt
复制
- 第三个阶段: Unicode(ISO)   

编码表示方法

  • ASCII-american standard code for information interchange
代码语言:txt
复制
- 所有控制字符(包括回车,删除等 )编码再0-31范围以及127
代码语言:txt
复制
- 所有标点符号,英文大小写放在32-126之间
代码语言:txt
复制
- 预留128-255之间位置
代码语言:txt
复制
- 0xxx xxxx 是它的编码形式
  • Latin1
代码语言:txt
复制
- 0-127的所有位置不动,那么可以兼容ASCII,二进制位0xxx xxxx
代码语言:txt
复制
- 128-255位置全部用完,二进制位1xxx xxxx
代码语言:txt
复制
    - 128-159之间为控制字符,
代码语言:txt
复制
    - 160-255位文字符号,
代码语言:txt
复制
    - 其中包括了西欧语言、希腊语、泰语、阿拉伯语、希伯来语
代码语言:txt
复制
- 欧元符号
  • GBxxxxxxxxxx
代码语言:txt
复制
- GB2312
代码语言:txt
复制
    - 如果一个字节中第一位为0,那么这就是一个ASCII字符。
代码语言:txt
复制
    -如果一个字节中第一位为1,那么这个是汉字,认定需要2个字节才表示一个编码的文字。
代码语言:txt
复制
    - 这个码表中包含汉字6763个和非汉字图形字符682个。
代码语言:txt
复制
    - 还有很多的空间没有用到,索性全部预留了吧。
代码语言:txt
复制
    - 0xxxxxxx:表示为ASCII字符
代码语言:txt
复制
    - 1xxxxxxx 1xxxxxxx:表示为汉字
代码语言:txt
复制
- GBK
代码语言:txt
复制
    - 在GB2312基础上添加汉字
代码语言:txt
复制
    - 兼任GB2312和ASCII
代码语言:txt
复制
    - 0xxxxxxx:表示为ASCII字符
代码语言:txt
复制
    - 1xxxxxxx xxxxxxxx:表示为汉字
代码语言:txt
复制
- GB18030
代码语言:txt
复制
    - 2/4位混编

Unicode编码

  • 只是一个码表,具体实现没有规定
  • 0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符
  • 中文的编码范围为4E00-9FCF,其中9FC4-9FCF之间的区间没有使用
  • 上述区间全部是汉字,不包含全角字符,不包含特殊文字
  • UTF=UnicodeTransformationFormat
  • UTF-8
代码语言:txt
复制
        0x0000~0x007F  (0 ~ 127)     1字节     0xxxxxxx
代码语言:txt
复制
        0x0080~0x07FF(128 ~ 2047)      110xxxxx 10xxxxxx
代码语言:txt
复制
        0x0800~FFFF(2048 ~ 65535)     3字节     1110xxxx 10xxxxxx 10xxxxxx
代码语言:txt
复制
        0x10000~1FFFFFF(65536 ~ 2097152)     4字节     11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
代码语言:txt
复制
        0x2000000~0x3FFFFFF     5字节     111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
代码语言:txt
复制
        0x4000000~0x7FFFFFFF     6字节     1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
  • UTF-16, UTF-32
代码语言:txt
复制
    - UTF-16 早期 Uncode历史遗留问题
代码语言:txt
复制
    - UTF-32 浪费空间
  • UCS-2
代码语言:txt
复制
- UCS=UniversalCharacterSet,通用字符集
代码语言:txt
复制
- UCS-2与Unicode相同
代码语言:txt
复制
- 采用2个字节,定长的表示每一个字符,所以总计可以表示2^16个字符
  • UCS-4
代码语言:txt
复制
- 第一个字节:表示组(group),最高位为0,则有128个。
代码语言:txt
复制
- 第二个字节:表示平面(plane),256个。
代码语言:txt
复制
- 第三个字节:表示行(row),256个。
代码语言:txt
复制
- 第四个字节:表示码位(cell),256个
代码语言:txt
复制
- 如果UCS-4前两个字节为0, 则就是CUS-2

常用概念

  • 编码/解码: 由人类可直接读取信息转换成bytes格式的,叫编码,反之叫解码
  • 大尾(BigEndian)和小尾(LittleEndian)
代码语言:txt
复制
    - '汉' -> 6C49
代码语言:txt
复制
    - 6C49 -> BigEndian
代码语言:txt
复制
    - 496C -> LittleEndian
  • BOM
代码语言:txt
复制
- UTF-8没有字节顺序问题
代码语言:txt
复制
- UTF-16会出现问题
代码语言:txt
复制
    - "奎" -> 594E
代码语言:txt
复制
    - "乙" -> 4E59
代码语言:txt
复制
- BOM-ByteOrderMark
代码语言:txt
复制
    - "ZERO WIDTH NO-BREAK SPACE" -> FEFF, 在UCS中不存在
代码语言:txt
复制
    - FEFF->BigEndian
代码语言:txt
复制
    - FFFE->LittleEndian
代码语言:txt
复制
    - UTF-8 用来表示编码, FEFF的UTF-8编码是EF BB BF, 
代码语言:txt
复制
        用来表示此后编码是UTF-8编码

Python编码问题

  • st
  • bytes
  • bytearray
代码语言:txt
复制
        >>> b = bytes.fromhex('E4 B8 AD')
代码语言:txt
复制
        >>> b
代码语言:txt
复制
        b'\xe4\xb8\xad'
代码语言:txt
复制
        >>> b.decode('utf-8')
代码语言:txt
复制
        '中'
代码语言:txt
复制
        >>> str(b)
代码语言:txt
复制
        "        b'\\xe4\\xb8\\xa"
代码语言:txt
复制
    >>> ord('A')
代码语言:txt
复制
    65
代码语言:txt
复制
    >>> ord('中')
代码语言:txt
复制
    20013
代码语言:txt
复制
    >>> chr(65)
代码语言:txt
复制
    'A'
代码语言:txt
复制
    >>> chr(20013)
代码语言:txt
复制
    '中'
  • python文件默认utf-8编码,如果特殊需要,需要声明
代码语言:txt
复制
- 放在第一行,或者第二行
代码语言:txt
复制
- ```# ‐\*‐ coding: windows‐1252 ‐\*‐```
代码语言:txt
复制
- 读写文件默认utf-8, 可以指定
代码语言:txt
复制
- code point方式比较字符串,可能会带来问题
代码语言:txt
复制
    -  重音符号的表示 
代码语言:txt
复制
    -  使用 unicodedata.normalize 函数
  • Python源码中出现了解码错误,那么会产生SyntaxError异常
  • 其他情况下,如果发现编码解码错误,那么会产生UnicodeEncodeError,

UnicodeDecodeError异常

参考资料

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 编码问题
  • 编码表示方法
  • Unicode编码
  • 常用概念
  • Python编码问题
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档