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/ ...
随机推荐
- c#知识总结1
一.C#程序结构 一个c#程序主要包括以下部分 ①命名空间声明 ②一个class ③class方法 ④class属性 ⑤一个main方法 ⑥语句 和 表达式 以及 注释 简单的“Helloworld” ...
- html基本标签练习
Alt 显示工具栏 f2修改文件名称 内联元素:<div>只占一行</div> 块级元素:<span></span> 以utf8无bom格式编码 安装 ...
- HazelCast 的内存管理原理
As it is said in the recent article "Google: Taming the Long Latency Tail - When More Machines ...
- Week,Month, Year 日期区间辅助类
我们在做一些业务系统的时候,经常会用到一些获取时间段的情况.比如要统计某一周.某月.某年 这样一些时间区间内的一些业务数据.这时候我们就需要获取当前时间段内的一些起止日期.这里分享一个通用的日期辅助类 ...
- quick 截屏
MainScene local MainScene = class("MainScene", function() return display.newScene("Ma ...
- POJ 3277 City Horizon(扫描线+线段树)
题目链接 类似求面积并..2Y.. #include <cstdio> #include <cstring> #include <string> #include ...
- state配置语言实战
修改配置文件:(base用来放初始化环境.prod用来放生产配置环境) [root@super65 ~]# vim /etc/salt/master [root@super65 ~]# mkdir - ...
- php任何优化的方式下这样第个列表都是再次查询
我们的代码经理是这样的:计算总行数:select count(*) from tablename where -..查询列表select * from tablename where - limit- ...
- 如何搭建redis扩展-Yii中文网
原文链接: 如何搭建redis扩展http://www.yii-china.com/post/detail/43.html 安装redis扩展: 1.通过composer进行安装,到项目根目录cmd运 ...
- GDUT——1169: Krito的讨伐(优先队列BFS)
1169: Krito的讨伐 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 619 Solved: 102 Description Krito终于干 ...