Python 编码的一些问题
# 编码问题
- 为什么需要编码问题
- 本质上计算机只能识别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 编码的一些问题的更多相关文章
- (转载) 浅谈python编码处理
最近业务中需要用 Python 写一些脚本.尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息. 很快,我就遇到了异常: UnicodeEncodeError: ...
- Python 编码简单说
先说说什么是编码. 编码(encoding)就是把一个字符映射到计算机底层使用的二进制码.编码方案(encoding scheme)规定了字符串是如何编码的. python编码,其实就是对python ...
- Python之路3【知识点】白话Python编码和文件操作
Python文件头部模板 先说个小知识点:如何在创建文件的时候自动添加文件的头部信息! 通过:file--settings 每次都通过file--setings打开设置页面太麻烦了!可以通过:View ...
- python编码规范
python编码规范 文件及目录规范 文件保存为 utf-8 格式. 程序首行必须为编码声明:# -*- coding:utf-8 -*- 文件名全部小写. 代码风格 空格 设置用空格符替换TAB符. ...
- 【转】python编码的问题
摘要: 为了在源代码中支持非ASCII字符,必须在源文件的第一行或者第二行显示地指定编码格式: # coding=utf-8 或者是: #!/usr/bin/python # -*- coding: ...
- 【转】python编码规范
http://blog.csdn.net/willhuo/article/details/49300441 决定开始Python之路了,利用业余时间,争取更深入学习Python.编程语言不是艺术,而是 ...
- python 编码 UnicodeDecodeError
将一个py脚本从Centos转到win运行,出错如下: UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position 0: il ...
- Python编码/文件读取/多线程
Python编码/文件读取/多线程 个人笔记~~记录才有成长 编码/文件读取/多线程 编码 常用的一般是gbk.utf-8,而在python中字符串一般是用Unicode来操作,这样才能按照单个字 ...
- 关于Python编码,超诡异的,我也是醉了
Python的编码问题,真是让人醉了.最近碰到的问题还真不少.比如中文文件名.csv .python对外呈现不一致啊,感觉好不公平. 没图说个JB,下面立马上图. 我早些时候的其他脚本,csv都是 ...
- 规范的python编码
规范的 python 编码令人赏心悦目,令代码的表达逻辑更清晰,使得工程代码更容易被维护和交流: 编码规范包括对于代码书写格式的约束,不良语法的禁用和推荐的编码手法,下面做些简要的描述: 1. 代码规 ...
随机推荐
- Java中对Array数组的常用操作
目录: 声明数组: 初始化数组: 查看数组长度: 遍历数组: int数组转成string数组: 从array中创建arraylist: 数组中是否包含某一个值: 将数组转成set集合: 将数组转成li ...
- 使用Docker搭建LNMP开发环境
1.什么是Docker Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技 ...
- 关于ubuntu远程访问服务器的知识点
为了可以打开图形界面,用ssh -X 用户名@地址 如何远程打开文件夹可视化界面 nautilus /文件夹
- ryzen nvidia hackintosh
1. 安装 参考 https://baijiahao.baidu.com/s?id=1595121885424169378&wfr=spider&for=pc 版本10.13.3 ...
- Matlab 如何/怎样 读取图片 显示图片 转换成灰度图
% 读取图片 im = imread('路径') >> im = imread('ny.png'); % 显示图片 imshow(im) >> imshow(im) % 转换成 ...
- git 入门教程
git 入门教程之协同开发 前面我们已经介绍过远程仓库的相关概念,不过那时并没有深入探讨,只是讲解了如何创建远程仓库以及推送最新工作成果到远程仓库,实际上远程仓库对于团队协同开发很重要,不仅仅是团队协 ...
- admin-7
Admin07 root tmooc 还原三台虚拟机[root@room9pc13 ~]# rht-vmctl reset classroom[root@room9pc13 ~]# rht-vmctl ...
- Java_01初识
1.配置环境变量 设置JAVA_HOME:新建系统变量,变量名为JAVA_HOME,变量值设置为java jdk所在的目录 设置path: 在所有数据的最前方添加%JAVA_HOME%\bin; 2. ...
- HI3518EV200+AR0130开发板烧录uboot、kernel、rootfs及其参数配置
分区名 分区大小 起始地址 截至地址bootloader:1M 0x00000000 0x00100000kernel: 3M 0x00100000 0x00400000rootfs: 12M 0x0 ...
- 2018-2019-2 网络对抗技术 20165308 Exp3 免杀原理与实践
2018-2019-2 网络对抗技术 20165308 Exp3 免杀原理与实践 实践内容(3.5分) 1.1 正确使用msf编码器(0.5分),msfvenom生成如jar之类的其他文件(0.5分) ...