# 编码问题
- 为什么需要编码问题
- 本质上计算机只能识别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. excel 用VBA将所有单元格内容全部转换为文本

    Sub 将所有列全部转换为文本() t=timer 'Cells(Rows.Count, 1).End(xlUp).Row 获取第一列最后一个非空单元格的行号 s = Cells(, Columns. ...

  2. Unity中对系统类进行扩展的方法

    Unity扩展系统类,整合简化代码 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...

  3. 在LINUX(Ubuntu 18.04.x、CentOS)下配置MySQL8.0.x

    安装教程:Installing MySQL on Unix/Linux Using Generic Binaries MySQL下载链接:https://dev.mysql.com/downloads ...

  4. Vue基础之内部指令(上)

    v-if.v-else-if.v-else以及v-show 条件指令v-if.v-else-if.v-else 类似于JavaScript里的if.else-if.else,这三个指令根据表达式的值对 ...

  5. python自动化框架(一)

    一.jsonpath难点分析 dic = { "error_code": 0, "stu_info": [ { "id": 2057, &q ...

  6. Ubuntu使用总结二

    Ubuntu使用 - 1.ubuntu怎么切换到root用户,切换到root账号方法 ubuntu怎么切换到root用户,我们都知道使用su root命令,去切换到root权限,此时会提示输入密码, ...

  7. c/c++的常用函数和STL使用

    一个超好用的c++网站:http://www.cplusplus.com/reference/string/string/erase/ 一.函数头中包含的函数 1.qsort函数对数组.结构体等进行排 ...

  8. 关于linux crontab定时操作oracle不执行的问题解决方案

    问题描述:启动定时任务对oracle表进行操作,但是手动执行脚本无问题,定时任务执行无结果不反馈消息 解决方案:以centos7为例吗,首先确定脚本可手动执行,然后检查/var/log/cron下的日 ...

  9. python中自定义的栈

    # 栈 先进后出 例如蒸笼,弹夹,饭菜等 class StackFullException(Exception): """自定义一个栈溢出异常""&q ...

  10. [随笔][Java][something]

    import 只能导入包中的类,不能导入某个包.为了方便,一般不导入单独的类,而是导入包下的所有类.import java.util.*; 包java.lang中的所有类默认由编译器全部导入了,不必手 ...