编码问题

编码问题

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

编码表示方法

  • ASCII-american standard code for information interchage
    • 所有控制字符(包括回车,删除等)编码在0-31范围以及127
    • 所有标点符号,英文大小写放在32-126之间
    • 预留128-255之间位置
    • 0xxx xxxx 是它的编码形式
  • Latin1
    • 0-127的所有位置不动,那么可以兼容ASCII,二进制0xxx xxxx
    • 128-159之间控制字符
    • 160-255位文字符号
    • 其中包括西语言、希腊语、泰语、阿拉伯语、希伯来语
    • 欧元符号
  • GB2312
  • GBK
  • GB18030
    • 2/4位混编

Unicode编码

  • 只是一个码表,具体实现没有规定
  • 0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符
  • 中文的编码范围为4E00-9FCF,其中9FC4-9FCF之间的区间没有使用
  • 上述区间全部是汉字,不包含全角字符,不包含特殊文字
  • UTF
  • UTF-8
  • UTF-16 早期Utcode历史遗留问题
  • UTF-32 浪费空间
  • UCS-2
    • USC = UniversalCharacterSet,通用字符集
    • USC-2与Unicode相同
    • 采用2个字节,定长的表示每一个字符,所以总计可以表示2^16个字符
  • UCS-4
    • 第一个字节
    • 第二个字节
    • 第三个字节
    • 第四个字节
    • 如果UCS-4前两个字节为0,则就是UCS-2

常用概念

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

Python编码问题

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

参考资料

  • https://www.cnblogs.com/jessonluo/p/4800331.html
  • https://blog.csdn.net/xuejianhui/article/
  • http://tools.jb51.net/table/gb2312
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值