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编码的秘密的更多相关文章

  1. Python全栈开发之路 【第三篇】:Python基础之字符编码和文件操作

    本节内容 一.三元运算 三元运算又称三目运算,是对简单的条件语句的简写,如: 简单条件语句: if 条件成立: val = 1 else: val = 2 改成三元运算: val = 1 if 条件成 ...

  2. python基础_字符编码

    字符编码的历史 阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII 阶段二:为了满足中文,中国人定制了GBK 阶段三:各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的 ...

  3. python编程笔记--字符编码

    ASCII码.Unicode.utf-8 ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电 ...

  4. python基础——字符串和编码

    python基础——字符串和编码 字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用 ...

  5. Python中进行Base64编码和解码

    Base64编码 广泛应用于MIME协议,作为电子邮件的传输编码,生成的编码可逆,后一两位可能有“=”,生成的编码都是ascii字符.优点:速度快,ascii字符,肉眼不可理解缺点:编码比较长,非常容 ...

  6. Python print报ascii编码异常的靠谱解决办法

    之前遇到此异常UnicodeEncodeError: 'ascii' codec can't encode characters...,都是用这种方式解决:sys.setdefaultencoding ...

  7. Python 2 中的编码

    在 Python 尤其是 Python2 中,编码问题是困扰开发者尤其初学者的一大问题.什么 Unicode/UTF-8/str ,又是 decode/encode 的,搞得人头都大了.其实不然,这有 ...

  8. Python基础之字符编码

    前言 字符编码非常容易出问题,我们要牢记几句话: 1.用什么编码保存的,就要用什么编码打开 2.程序的执行,是先将文件读入内存中 3.unicode是父编码,只能encode解码成其他编码格式 utf ...

  9. 六 Python基础 字符串和编码

    字符编码 我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特 ...

  10. python中的URL编码和解码

    python中的URL编码和解码:test.py # 引入urllib的request模块 import urllib.request url = 'https://www.douban.com/j/ ...

随机推荐

  1. 单元测试框架-TestNG的安装

    一.在eclipse中安装TestNG插件 1)打开eclipse,选择help--> Install New Software

  2. nodeAPI--HTTP

    HTTP:   //超文本协议,是属于TCP上层的协议 http协议构建在请求和响应概念上,node.js中对应http.ServerRequest,http.ServerResponse; 当用户浏 ...

  3. 解决Windows 10下Wireshark运行问题

    解决Windows 10下Wireshark运行问题在Windows 10下,安装Wireshark时候,提示WinPcap不被系统系统支持.这是由于最新版的WinPcap 4.1.3只支持到Wind ...

  4. PDA手持终端集成一体打印 二次开发

    PDA手持终端集成一体打印 二次开发支持 VS2008或VS2005开发工具 c#或C++开发语言 Mobile6.5,支持GSM通话,GPRS,EDGE网络;内置wifi,蓝牙,gps商场单品管理小 ...

  5. JAVA定时执行任务,每天定时几点钟执行任务

    JAVA定时执行任务,每天定时几点钟执行任务的示例如下: 1.建立TimerManage类,设置时间点,时间点设置的管理类,代码如下: package com.pcitc.time; import j ...

  6. SPOJ839 Optimal Marks(最小割)

    题目大概说给一张图,每个点都有权,边的权等于其两端点权的异或和,现已知几个点的权,为了使所有边的边权和最小,其他点的权值该是多少. 很有意思的一道题,完全看不出和网络流有什么关系. 考虑每个未知的点$ ...

  7. POJ3321 Apple Tree(DFS序)

    题目,是对一颗树,单点修改.子树查询.典型的dfs序入门题. DFS序可以将一颗树与子树们表示为一个连续的区间,然后用线段树来维护:感觉算是树链剖分的一种吧,和轻重链剖分不同的是这是对子树进行剖分的. ...

  8. BZOJ3939 : [Usaco2015 Feb]Cow Hopscotch

    设f[i][j]表示到(i,j)的方案数,则有 $f[i][j]=\sum f[x][y](x<i,y<j,a[x][y]!=a[i][j])=\sum f[x][y](x<i,y& ...

  9. BZOJ3787 : Gty的文艺妹子序列

    将序列分成$\sqrt{n}$块,预处理出每两块之间的逆序对数,以及ap[i]表示前i块内数字出现次数的树状数组 预处理:$O(n\sqrt{n}\log n)$ 修改时,ap[i]可以在$O(\sq ...

  10. c语言字符串操作,及常用函数

    一,字符串操作 1 . strcpy : 拷贝 char *stpcpy(char *destin, char *source); 2 . strcat :  拼接 char *strcat(char ...