# 编码问题
- 为什么需要编码问题
- 本质上计算机只能识别01代码
- 如何用一长串01代码表示复杂信息
- 编码历史
- 二进制
- byte: 一个0或1的二进制
- bit: 8个01代码,字节
- 第一阶段: ASCII
- 第二阶段: 百花齐放, GB2312, GBK, Latin1, Big5, JIS.....
- Latin1: 兼容欧洲大多数语言
- 中国: GBxxxx
- 韩国和台湾: BIG5
- 日本: JIS
- 微软: ANSI-MBCS(Multi-bytes charecter set,多字节字符集)
- 第三阶段: Unicode(ISO) # 编码表示方法
- ASCII-american standard code for information interchane
- 所有控制字符(包括回车,删除等)编码再0-31范围已经127
- 所有标点符号, 英文大小写在32-126之间
- 预留128-255之间
- 0xxx xxxx 代码的形式
- Latin1
- 0-127之间不动,那么就可以兼容ASCII码,二进制位0xxx xxxx
  - 128-255的范围全部用完,二进制1xxx xxxx
  - 128-159之间控制字符
  - 160-255之间是文字字符
  - 其中包括希腊语,西欧语,泰语,阿拉伯语,希伯来语
  - 欧元符号
- GBxxxxxx
- GB2312
  - 如果一个字节第一位是0,那么他就是ASCII码
  - 如果第一个字节是1,那么他就是汉字,需要2个字节表示一个编码的文字
  - 这个码表中包含汉字6763个和非汉字图像字符682个
  - 0xxxxxxx: 表示ASCII字符
  - 1xxxxxxx xxxxxxxx: 表示汉字
- GBK
- 在GB2312基础上添加汉字
  - 兼容GB2312和ASCII码
  - 0xxxxxxx: 表示ASCII字符
  - 1xxxxxxx xxxxxxxx: 表示汉字
- GB18030
- 2/4位混编码 - Unicode编码问题
- 实例: "中" -> 45629 -> 二进制
- Unicode只是一个码表,具体实现没有规定
- 0-0x10FFFF来映射这些组反映,最多可以容纳1114112字符
- 中文的编码范围4E00-9FCF,其中9FC4-9FCF之间的区间没有使用
- 上述区间全部是汉字,不包含全角字符,不包含特殊文字
- UTF = Unicode Transformation Format
- UTF-8
0X0000~0x007F (0 ~ 127) 1字节 0xxxxxxx
0x0080~0x07FF(128 ~ 2047) 110xxxxx 10xxxxxx
0x0800~FFFF(2048 ~ 65535) 3字节 1110xxxx 10xxxxxx 10xxxxxx
0x10000~1FFFFFF(65536 ~ 2097152) 4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
0x2000000~0x3FFFFFF 5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
0x4000000~0x7FFFFFFF 6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx - UTF-16, UTF-32
- UTF-16 早期历史遗留问题
- UTF-32 浪费空间 - UCS-2
  - USC = UniversalCharacterSet,通用字符集
  - UCS-2与Unicode相同
  - 采用2个字节,定长的表示一个字符,所以总计可以表示2^16个字符
- UCS-4
  - 第一个字节: 表示组(group), 最高位为0, 则有128个
  - 第二个字节: 表示平面(Plane), 256个
  - 第三个字节: 表示行(row), 256个
  - 第四个字节: 表示码位(cell), 256个
  - 如果UCS-4前两个字节为0, 则就是CUS-2 # 常用概念:
- 编码/解码: 由人类可直接读取信息转换成bytes格式的,叫编码,反之叫解码
- 大尾(BigEndian)和小尾(LittleEndian)
- '汉' -> 6C49
  - 6c49 -> BigEndian
  - 496C -> LittleEndian - BOM
- UTF-8: 没有字节顺序问题
  - UTF-16: 会出现问题
- "奎" -> 594E
- "乙" -> 4E59
- BOM-ByteOrderMark
    - "ZERO WIDTH NO-BREAK SPACE" -> FEFF, 在UCS中不存在
    - FEFF -> BigEndian
    - FFFE -> LittleEndian
    - Utf-8 用来表示编码, FEFF的UTF-8编码是 EF BB BF ,用来表示此编码是UTF-8编码 # Python的问题
- str
- bytes
- bytearray
- 编码指定实例:
>>> b = byte.fromhex('E4 B8 AD)
>>> b
b'\xe4\xb8\xad'
>>> b.decode('utf-8')
'中'
>>> str(b)
" b'\\xe4\\xb8\\xa" - 编码和解码的实例:
>>> ord('A')
65
>>> ord('中')
20013
>>> chr(65)
'A'
>>> chr(20013)
'中' - Python文件默认是UTF-8编码,如果需要特殊需要,需要声明
- 放在第一项,或者第二行
- '''# -*- coding: windows-1252 -*-'''
- 读写文件默认UTF-8,可以指定
- code point 方式比较字符串, 可能会带来问题
    - 重音符号的表示
    - 使用 unicodedata.normalize 函数
- Python源码出现了解码错误,那么会产生SyntaxError异常
- 其他情况下,如果发现编码解码错误,那么会产生UnicodeEncodeError,UnicodeDecodeError异常 # 参考资料
- https://blog.csdn.net/xuejianhui/article/details/52576771
- https://www.cnblogs.com/jessonluo/p/4800331.html
- http://tools.jb51.net/table/gb2312

Python 编码的一些问题的更多相关文章

  1. (转载) 浅谈python编码处理

    最近业务中需要用 Python 写一些脚本.尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息. 很快,我就遇到了异常: UnicodeEncodeError: ...

  2. Python 编码简单说

    先说说什么是编码. 编码(encoding)就是把一个字符映射到计算机底层使用的二进制码.编码方案(encoding scheme)规定了字符串是如何编码的. python编码,其实就是对python ...

  3. Python之路3【知识点】白话Python编码和文件操作

    Python文件头部模板 先说个小知识点:如何在创建文件的时候自动添加文件的头部信息! 通过:file--settings 每次都通过file--setings打开设置页面太麻烦了!可以通过:View ...

  4. python编码规范

    python编码规范 文件及目录规范 文件保存为 utf-8 格式. 程序首行必须为编码声明:# -*- coding:utf-8 -*- 文件名全部小写. 代码风格 空格 设置用空格符替换TAB符. ...

  5. 【转】python编码的问题

    摘要: 为了在源代码中支持非ASCII字符,必须在源文件的第一行或者第二行显示地指定编码格式: # coding=utf-8 或者是: #!/usr/bin/python # -*- coding: ...

  6. 【转】python编码规范

    http://blog.csdn.net/willhuo/article/details/49300441 决定开始Python之路了,利用业余时间,争取更深入学习Python.编程语言不是艺术,而是 ...

  7. python 编码 UnicodeDecodeError

    将一个py脚本从Centos转到win运行,出错如下: UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position 0: il ...

  8. Python编码/文件读取/多线程

    Python编码/文件读取/多线程 个人笔记~~记录才有成长   编码/文件读取/多线程 编码 常用的一般是gbk.utf-8,而在python中字符串一般是用Unicode来操作,这样才能按照单个字 ...

  9. 关于Python编码,超诡异的,我也是醉了

    Python的编码问题,真是让人醉了.最近碰到的问题还真不少.比如中文文件名.csv .python对外呈现不一致啊,感觉好不公平. 没图说个JB,下面立马上图.   我早些时候的其他脚本,csv都是 ...

  10. 规范的python编码

    规范的 python 编码令人赏心悦目,令代码的表达逻辑更清晰,使得工程代码更容易被维护和交流: 编码规范包括对于代码书写格式的约束,不良语法的禁用和推荐的编码手法,下面做些简要的描述: 1. 代码规 ...

随机推荐

  1. Spring Boot的第一个程序

    Spring boot是由Pivotal团队提供的全新框架,在设计之初,其目的是为了简化Spring应用的创建.运行.测试.调试.部署的过程.Spring Boot框架不仅简化了Spring的搭建过程 ...

  2. vue 父子组件通信

    算是初学vue,整理一下父子组件通信笔记. 父组件通过 prop 给子组件下发数据,子组件通过事件给父组件发送消息. 一.父组件向子组件下发数据: 1.在子组件中显式地用props选项声明它预期的数据 ...

  3. JavaScript 运动(缓冲运动,多物体运动 ,多物体多值运动+回调机制)

    匀速运动   (当需要物体做匀速运动直接调用statMove函数) function startMove(dom,targetPosetion){ //dom : 运动对象,targetPositio ...

  4. 改变highCharts的X轴和Y轴的数据刻度

    xAxis:{ tickPixelInterval:10 //自行调整X轴刻度的间距}, yAxis:{ lineWidth:1, //Y轴默认不显示Y轴线,添加一个轴线的宽度就可以显示出来 tick ...

  5. zoj 2524 并查集裸

    Description There are so many different religions in the world today that it is difficult to keep tr ...

  6. 2018.5.8 python操纵sqlite数据库

    创建: create_Email = "CREATE TABLE if not exists emails (\n\ id INTEGER NOT NULL,\n\ user VARCHAR ...

  7. Privoxy代理的使用

    目录 1. Privoxy介绍 1.1 安装 1.2 配置 1.3 使用 1.4 其他配置 1.5 测试链接及查看配置 2. 相关信息 https://www.privoxy.org/ http:// ...

  8. 2018-2019-2 20165313 《网络对抗技术》 Exp5:MSF基础应用

    实践使用漏洞和辅助模块 任务一:MS17-010安全漏洞 任务二:(1)MS11-050(失败)(2)MS14-064(唯一) 任务三:abode_flash_avm2 辅助模块:(1)ARP扫描模块 ...

  9. java_集合类_简

    Collection 来源于Java.util包,实用常用的数据结构,字面意思就是容器 主要方法 boolean add(Object o)添加对象到集合 boolean remove(Object ...

  10. FlexRay通信机制

    通信周期是 FlexRay 的基本通信单元[6~7,19].每个通信周期包括四个时间层,如图 2-9 所示.通信周期由静态段(Static Segment).动态段(Dynamic Segment). ...