python 之 utf-8编码的秘密
python3的默认编码方案是utf-8编码,看了些资料,来做总结。
要说utf-8,就要说说unicode,要说unicode,就要说ASCII,我们还是慢慢来。
1.ASCII
ASCII编码最初是由老美搞出来的,满足了英文在计算机中的的表达和存储。开始呢,ASCII使用一个字节的后7位来进行编码。
每位有0,1 两种状态,那么就有2^7个数(十进制从0~127)来代表128个不同的字符。后来人们又对ASCII码进行了扩展,把最高位也用上了,那么就又多了128个可编码的空间。
可是,全世界难道就只有老美用计算机吗?中文,韩文,日文,阿拉伯文.....在计算机中怎么表示呢?
于是各国开始搞自己的一套编码方案,比如我国常见的GBK系列编码,基本解决看了中文编码的问题。
随着网络的日益发达,人们的交流不限于自己的国家,还可以通过网络与国外交流。但是碎片化的文字编码阻碍了不同国家文字的传播,乱码时常发生。
于是,伟大的创想Unicode诞生了。
2.Unicode
“Unicode(万国码、单一码)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发,1994年正式公布”
但是,unicode并没有被广泛使用,其中一个很重要的原因是:unicode如何编码?如果统一用2个字节编码,那么ASCII用户就不高兴了,因为原先的ABC只占3个字节,采用unicode就会翻倍为6个字节,但是不采用多为字节编码,那么如何容纳世界各国的语言呢?万国码的创想又怎么能够实现?
为了解决这个问题,utf-8 utf-16 utf-32相继诞生
3.utf-8
utf-8机智地使用了变长编码方式。具体如下:
| NULL | Unicode码范围 | utf-8编码填充模板 | 
| 一区 | 0000 0000~0000 007F | 0xxxxxxx | 
| 二区 | 0000 0080~0000 07FF | 110xxxxx 10xxxxxx | 
| 三区 | 0000 0800~0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx | 
| 四区 | 0001 0000~0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | 
可以看出:一区的字符都是采用一个字节编码,而一区的字符就是原来的ASCII字符,所以utf-8是兼容ASCII的,因此一个纯粹的ASCII码文件也能被考虑为一个UTF-8 文件, 而且一个碰巧只使用ASCII码字符的 UTF-8 文件和拥有同样字符的ASCII码文件是相同的。
再来看三区,这个区集中了大部分的中文编码。
根据Unicode的汉字编码查询表(http://bianma.supfree.net/sos.asp?id=14)可知,汉字”中“的Unicode编码为:0X4E2D,而 0X4E2D 在 0000 0800~0000 FFFF这个范围内,所以,将”中“的Unicode编码的二进制
100111000101101 从低位到高位 从后往前填充 到 对应utf-8模板 1110xxxx 10xxxxxx 10xxxxxx 中,取代里面的 'x' ,填充后若有多余的 ‘x’ 用 0 取代之,得到的二进制数据 11100100 10111000 10101101 就是"中"的utf-8编码,用16进制表示就是:
\xe4\xb8\xad
也就是说:unicode提供了各种字符的编码值,也可以叫做代号,一个字符有一个独一无二的代号,这个值正是unicode确定的。
而utf-8则是提供了字符的代号在内存中的存储方案,用于编码和解码。Unicode叫做字符集,而UTF-8  UTF-16则是字符编码。
utf-8引擎如何解码?
这是我一直在想的问题,下面是我的猜测。如有不对之处,敬请批评指正。
ASCII码字符都只占一个字节,所以解码ASCII很方便,只需要读取一个字节的数据,翻译为字符,再读取一个字节的数据,翻译为字符。。。。。
可是,utf-8是变长编码,它怎么知道要下一个字符需要读取几个字节来翻译为一个字符呢?
我们可以把红色框框(也就是一个字符utf-8编码的第一个字节)看作”组长”,后面的连续的字节看作“小组普通成员”。那个,这个小组一共有多少人,都包含在组长的信息里面。
一区的组长的最高位是0,就暗含信息:我这个组只有我一个人,那么utf-8引擎在解码的时候就只去读这一个字节,完成翻译。
二区的组长最高为位有2个1,暗含信息:我这个组有2个人,那么utf-8引擎在解码的时候就只去读这2个字节,完成翻译。
三区的组长最高为位有3个1,暗含信息:我这个组有3个人,那么utf-8引擎在解码的时候就只去读这3个字节,完成翻译。
:
:
同时,为了防止数据损坏而造成数据丢失,每个普通成员字节的前2位都是10,来标识自己是成员身份。
python 之 utf-8编码的秘密的更多相关文章
- Python全栈开发之路 【第三篇】:Python基础之字符编码和文件操作
		本节内容 一.三元运算 三元运算又称三目运算,是对简单的条件语句的简写,如: 简单条件语句: if 条件成立: val = 1 else: val = 2 改成三元运算: val = 1 if 条件成 ... 
- python基础_字符编码
		字符编码的历史 阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII 阶段二:为了满足中文,中国人定制了GBK 阶段三:各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的 ... 
- python编程笔记--字符编码
		ASCII码.Unicode.utf-8 ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电 ... 
- python基础——字符串和编码
		python基础——字符串和编码 字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用 ... 
- Python中进行Base64编码和解码
		Base64编码 广泛应用于MIME协议,作为电子邮件的传输编码,生成的编码可逆,后一两位可能有“=”,生成的编码都是ascii字符.优点:速度快,ascii字符,肉眼不可理解缺点:编码比较长,非常容 ... 
- Python print报ascii编码异常的靠谱解决办法
		之前遇到此异常UnicodeEncodeError: 'ascii' codec can't encode characters...,都是用这种方式解决:sys.setdefaultencoding ... 
- Python 2 中的编码
		在 Python 尤其是 Python2 中,编码问题是困扰开发者尤其初学者的一大问题.什么 Unicode/UTF-8/str ,又是 decode/encode 的,搞得人头都大了.其实不然,这有 ... 
- Python基础之字符编码
		前言 字符编码非常容易出问题,我们要牢记几句话: 1.用什么编码保存的,就要用什么编码打开 2.程序的执行,是先将文件读入内存中 3.unicode是父编码,只能encode解码成其他编码格式 utf ... 
- 六 Python基础 字符串和编码
		字符编码 我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特 ... 
- python中的URL编码和解码
		python中的URL编码和解码:test.py # 引入urllib的request模块 import urllib.request url = 'https://www.douban.com/j/ ... 
随机推荐
- JVM的基本结构
			首先,当一个程序启动之前,它的class会被类装载器装入方法区,执行引擎读取方法区的字节码自适应解析,边解析就边运行(其中一种方式),然后pc寄存器指向了main函数所在位置,虚拟机开始为main函数 ... 
- aaaaaaaaaaaaaa
			方法和事件的区别是? For(var 0 in file) Foreach(var i=0;i<length.i++) Git stash Git pull –rebase origin bra ... 
- 系统启动时,spring配置文件解析失败,报”cvc-elt.1: 找不到元素 'beans' 的声明“异常
			现象:spring加载配置文件applicationContext.xml出错,抛出nested exception is og.xml.sax.SAXParseException; lineNumb ... 
- sprint1的个人总结及《构建之法》8、9、10章读后感
			对sprint1的总结: 我们这次的sprint1做的挺差的,大家原来说好的分工都没有完成,也许是大家这段时间的大作业花了更多的时间,所以对这次团队任务的进度是拖慢了很多,但是团队已经认清了现阶段的问 ... 
- 一份spring配置文件及其详解
			本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/axu20/archive/2009/10/14/4668188.aspx 1.基本配置:<?xml versio ... 
- [Cocos2d-x For WP8]EaseActions缓动动作
			我们用Silverlight框架开发WP8的应用程序的时,编写动画可以使用缓动效果来实现缓动动画对吧,那么在Cocos2d-x框架里面我们一样是可以缓动动作(缓动动画),其实技术的东西都是想通的,如果 ... 
- 【BZOJ】3709: [PA2014]Bohater(贪心)
			http://www.lydsy.com/JudgeOnline/problem.php?id=3709 很水的题...但是由于脑洞小..漏想了一种情况.. 首先显然能补血的先杀.. 然后杀完后从补血 ... 
- iOS真机调试的验证项
			基本的匹配项 App 描述文件 BundleID (匹配) ApplicationID Cert (匹配) Cert DeviceID (被包含) DeviceIDs 描述文件就是包含了各种需要验证信 ... 
- python 面向对象的三大特征之 封装
			封装:私有化 class Person(object): def __init__(self): self.__gender = "man" #在类的属性名称前面加__ self. ... 
- github配置
			注册github账号: 准备秘钥文件: 认证: https://github.com 测试秘钥: 创建仓库: 执行下面命令创建git远程仓库: 添加一个two.txt文件: 
