# 编码问题
- 为什么需要编码问题
- 本质上计算机只能识别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. 20个可用于商业用途的免费 CC0 授权的高分辨率图库

    如今国人已经越来越重视版权了. 而用CC0 授权的图片不用担心版权的问题,那么什么是CC0授权呢?简单来说就是「公共领域贡献宣告」授权,当创作者在自身作品使用 CC0 授权时,代表于符合法律规定的最大 ...

  2. oc语言的Foundation框架(学习笔记2)

    紧接上文…… 4.集合对象 4.1数组 1.基本概念 Foundation中的数组(NSArray,NSMutableArray)是一组有序的对象集合,通过索引下标获取到数组中的各个元素,也分可变和不 ...

  3. postman连续添加多个订单&jmeter快速审核添加订单

    预期效果:添加多个订单,并审核(半自动?) 1.postman添加多个订单 post请求(postman基础的操作比较简单,网上有很详细的解说),单个接口保存[save] 单个接口保存[save],点 ...

  4. Elasticsearch2.3.4使用手册(使用存储过程做增量同步的探索)

    一.工具安装 访问官网https://www.elastic.co/downloads/elasticsearch和http://xbib.org/repository/org/xbib/elasti ...

  5. Restful levels&HATEOAS详解

    RESTful: Rest是一种软件架构风格.设计风格,而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等 ...

  6. 2018.9.12 B树总结

    1. B-Tree B-树是一种平衡的多路查找树,它在文件系统中很有用. 1.1 B-Tree 特性 关键字集合分布在整颗树中: 任何一个关键字出现且只出现在一个结点中: 搜索有可能在非叶子结点结束: ...

  7. 基于mpvue搭建微信小程序

    mpvue是美团开源的一套语法,语法与vue.js一致,快速开发小程序的前端框架.框架基于vue.js核心,修改了vue.js的runtime和compiler实现,使用此框架,开发者可以完全使用vu ...

  8. mysql trigger 备忘

    最近用mysql有这么一个需求 item表:id,item,url,websiteid website表:id,domain item表示从不同网站获取的信息 website表示获得信息的网站,其中的 ...

  9. JDK安装与环境配置——学习JAVA的准备工作

    1.安装JDK 官网,版本看了也不明白区别,我下载的第一个 JAVA SE 12 https://www.oracle.com/technetwork/java/javase/downloads/in ...

  10. git 命令提交文件

    方法/步骤   打开要添加的文件的位置,右键,点击下面强调的内容,进入命令页面 先执行命git pull,这是提交的基本操作, git status,查看现在当前的文件状态 没有看到你现在要添加的文件 ...