先说两个基础知识。

(1)计算机内部,数据是由0,1组成的;

(2)计算机最小的数据单位,就是一个二进制单位即bit,接下来就是8个二进制单位表示一个字节(Byte)。

1 ASCII码

ASCII码(American Standard Code for Information Interchange,美国信息交换标准)只能用0,1表示26个字母(大小写共计52个),阿拉伯数据(10个),还有一些标点符号、运算符号以及控制符(如换行,回车等)。

如果需要非常清楚的知道对应规则,可以查阅ASCII码表

需要表示的不多,所以仅拿出7位数字(0-127)来表示字符,这叫做基础ASCII码。剩下的(128-255)则留作扩展用。这也就意味着基础ASCII码字节的最高位永远是0

在Python里可以看一下。

print('a') #打印字母a
print(ord('a')) #打印出字母a的ASCII码十进制
print(bin(ord('a'))) #打印出字母a的ASCII码二进制

输出结果

a
97
0b110 0001 #0b表示是二进制,最高位是0,但python输出自动省略了

2 多字节字符编码(MBCS)——以中文为例

表示汉字的话,ASCII码就不够用了,那么就拿多个字节来表示。不同国家语言文字的编码都要遵守一个共同的法则,就是要对ASCII码保持向下兼容。

也就是,最核心的就是原来ASCII码最高位为0,那么如果仍然是英文字母,这个最高位就还是0,而不是英文字母,这个最高位就变成1。

2.1 GB2312

以我们中文而论,我们国家在 1981 年发布了简体中文汉字编码国家标准,也称为 GB2312。

它的大致思想是使用1个94*94 的矩阵将所有字符存储起来。行称为区,列成为位。而中文字符也按照常用程度分为一级汉字和二级汉字。每一个中文字符都是用区字节和位字节来表示的。为了和 ASCII 码兼容,作了如下规定:一个小于 127 字符的意义与原来ASCII 码相同,但两个大于 127 的字符连在一起就表示的是一个汉字。一个汉字。这样实际上就足够有214 = 16384种表示方法,这个数字不仅能够涵盖绝大部分的中文简体字,还可以把数学符号,罗马希腊字母以及日本的假名都编进去,甚至原来在ASCII 码里的数字、标点和字母也编了进去。但是这些数字和字母和原来 ASCII 码不同的是它是用两个字节表示的,因此称作全角符号,而原来的 ASCII 码字符则还称作半角符号。


GB2312编码对所收录字符进行了“分区”处理,共94个区,每区含有94个位,共8836个码位。这种表示方式也称为区位码。

01-09区收录除汉字外的682个字符。

10-15区为空白区,没有使用。

16-55区收录3755个一级汉字,按拼音排序。

56-87区收录3008个二级汉字,按部首/笔画排序。

88-94区为空白区,没有使用。

举例来说,“啊”字是GB2312编码中的第一个汉字,它位于16区的01位,所以它的区位码就是1601。

具体的可以参看这个网站GB2312编码


但由于要和 ASCII 码兼容,无论区码还是位码都要最高位为1。理论上我们只需要将每个码加上128(十六进制表示0x80),但是GB2312规定的是每个码加上160(十六进制表示0xa0)。这样“啊”在计算机里真正的存储为0xb0,0xa1。

2.2 GBK

但是GB2312实际上只收录了6763 个汉字,对于绝大部分应用是够了。但是对于特殊字就不好办了。还有就是台湾人民所使用的繁体字(big5编码),也不支持。

原来 GB2312 规定两个字节最高位都不能是1,而 GBK 规定首字节的最高位为1,我们就认为后面是两个字节来表示汉字,而第2个字节的最高位可以不是1。于是乎就大大扩展了编码范围,这一次收录了21003个汉字,而且将繁体字也纳入进来。

2.3 BIG5

1984年,台湾五大厂商宏碁、神通、佳佳、零壹以及大众一同制定了一种繁体中文编码方案,因其来源被称为五大码,英文写作Big5,后来按英文翻译回汉字后,普遍被称为大五码。目前,Big5编码在台湾、香港、澳门及其他海外华人中普遍使用,成为了繁体中文编码的事实标准。由于Big5编码和GB2312编码是冲突的,因此一个文本内不可能既支持BIG5,也支持GB2312。实际上虽然GBK可以支持繁体中文,但是它和BIG5编码也是相互冲突,并不兼容的。

2.4 CodePage, MBCS, DBCS和ANSI

不仅仅中文如此,日文、韩文以及其他国家的文字也都是如此。因此这一类我们称之为多字节字符编码(MBCS),但是由于实际上都是两个字节,因此有的时候我们也将其称之为双字节字符编码(DBCS)。微软也将其称之为美国国家标准(ANSI),所以我们在使用操作windows系统的记事本的时候,在另存时选择字符编码为ANSI,如果你是简体中文操作系统,其实就是GBK,而如果是繁体操作系统的话,则是BIG5编码。IBM为了统一各国字符编码系统,他把所有的编码编成了一本厚厚的“书”,中文的GBK编码在936页,因此也称之为CodePage-936,而BIG5在950页,也称之为CodePage-950。

CodePage,MBCS,DBCS和ANSI这四个概念,其实是同一个意思,它们均不特指某一个字符编码,而是在不同的地区和国家包括特定的含义。

3 统一字符编码(Unicode, UTF-8)

最早的Unicode编码是通过两个字节来进行编码,但是我们已经知道两个字节最多只能有\(2^{16}=65,536\)种表示方法,这个用来表示基于字母的语言是够用的,但是对于类似中文、韩文、日文这样的文字,那么这个编码还不够。于是Unicode拿出了四个字节来进行存储。第1个字节称之为组,第2个字节称之为面,第3个字节称之为行,第4个字节称之为点。其中第0组,第0个面,会涵盖绝大部分我们所使用的文字,因此也称之为基本多语种平面(Basic Multilingual Plane)。

实际上,我们现在仅用了17个平面(从平面0-平面16)来存储全世界所有的文字,这样实际上是总共用了\(65,536×17=1114112\)个码位。也就是说全世界所有的文字都能够在0-1114111当中找到,这里面包括了71226个汉字。

规定了这所有文字的编码后,接下来面临的一个问题就是如何将这些文字编码以字节的形式表示在计算机里,这个过程我们也称之为Encoding过程。

于是出现了各种编码转换方法(Universal Transformation Formats),而最为著名的就是UTF-8。这个也促成了Unicode编码和计算机存储的分离。UTF-8的编码原则有以下2条:

  • 如果一个字符的Unicode编码小于128,这用一个字节表示,保证了兼容ASCII码;

  • 如果一个字符大于128,这按照如下表规则编码成2、3或者4个字节。

【参考】

[1]《爬虫基础知识之字符编码(以Python为例)》互联网空间数据挖掘研究小组

[2] GB2312编码表

【Python学习】字符编码的更多相关文章

  1. Python学习-字符编码, 数据类型

    本篇主要内容: 字符编码 Python中的数据类型有哪些 类型的一些常用操作及方法 一.字符编码 编码解释的大部分内容摘自廖雪峰老师教程中的讲解,点击跳转. 简单介绍: 我们知道计算机只能处理数字,如 ...

  2. Python学习-字符编码浅析

    1.什么是字符编码 既然是简述那肯定是简单明了.字符编码,看名字就是一种字符的编码格式,由于计算机内部采用二进制,想要将人类的语言字符输入到计算机就需要一种编码格式,这就是字符编码.字符------- ...

  3. Python常见字符编码间的转换

    主要内容:     1.Unicode 和 UTF-8的爱恨纠葛     2.字符在硬盘上的存储     3.编码的转换     4.验证编码是否转换正确     5.Python bytes类型 前 ...

  4. Python基础-字符编码与转码

    ***了解计算机的底层原理*** Python全栈开发之Python基础-字符编码与转码 需知: 1.在python2默认编码是ASCII, python3里默认是utf-8 2.unicode 分为 ...

  5. Python的字符编码

    Python的字符编码 1. Python字符编码简介 1. 1  ASCII Python解释器在加载.py文件的代码时,会对内容进行编码,一般默认为ASCII码.ASCII(American St ...

  6. Python常用字符编码(转)

    Python常用字符编码   字符编码的常用种类介绍 第一种:ASCII码 ASCII(American Standard Code for Information Interchange,美国信息交 ...

  7. python 3字符编码

    python 3字符编码 官方链接:http://legacy.python.org/dev/peps/pep-0263/ 在Python2中默认是ascii编码,Python3是utf-8编码 在p ...

  8. Python 的字符编码

    配置: Python 2.7 + Sublime Text 2 + OS X 10.10 本文意在理清各种编码的关系并以此解决 Python 中的编码问题. 1 编码基本概念 只有先了解字符表.编码字 ...

  9. 转:Python常见字符编码及其之间的转换

    参考:Python常见字符编码 + Python常见字符编码间的转换 一.Python常见字符编码 字符编码的常用种类介绍 第一种:ASCII码 ASCII(American Standard Cod ...

  10. 《转》Python学习(13)-Python的字符编码

    转自 http://www.cnblogs.com/BeginMan/p/3166363.html 一.字符编码中ASCII.Unicode和UTF-8的区别 点击阅读:http://www.cnbl ...

随机推荐

  1. MVC、MVP、MVVM 模式

    一.前言 做客户端开发.前端开发对MVC.MVP.MVVM这些名词不了解也应该大致听过,都是为了解决图形界面应用程序复杂性管理问题而产生的应用架构模式.网上很多文章关于这方面的讨论比较杂乱,各种MV* ...

  2. 【C++】new和delete表达式与内存管理

    new和delete表达式可以用来动态创建和释放单个对象,也可以用来动态创建和释放动态数组. 定义变量时,必须指定其数据类型和名字.而动态创建对象时,只需指定其数据类型,而不必为该对象命名.new表达 ...

  3. angularjs 常用功能练习

    <!DOCTYPE html> <html ng-app="app"> <head> <meta charset="utf-8& ...

  4. echarts tooltip 自定义formatter怎么设置颜色?

    formatter: function(params) { var result = ''; params.forEach(function (item) { result += item.marke ...

  5. Using the command line to manage files on HDFS--转载

    原文地址:http://zh.hortonworks.com/hadoop-tutorial/using-commandline-manage-files-hdfs/ In this tutorial ...

  6. 【Linux】无法将 Ethernet0 连接到虚拟网络“VMnet8”

    Linux安装centos之后,可能会出现ipconfig命令之后没有看到eth0信息,只有lo.log日志包的错为:无法将 Ethernet0 连接到虚拟网络“VMnet8” 解决办法有: 1.在虚 ...

  7. Toast与Snackbar的那点事

    背景 Toast是Android平台上的常用技术.从用户角度来看,Toast是用户与App交互最基本的提示控件:从开发者角度来看,Toast是开发过程中常用的调试手段之一.此外,Toast语法也非常简 ...

  8. HDU1863畅通工程---并查集+最小生成树

    #include<cstdio> #include<algorithm> #define MAX 105 struct edge { int from,to; long lon ...

  9. scala(二)

    一.映射 1.Scala映射就是键值对的集合Map.默认情况下,Scala中使用不可变的映射. 如果想使用可变集合Map,必须导入scala.collection.mutable.Map    (导包 ...

  10. 洛谷P1943 LocalMaxima_NOI导刊2009提高(1)(分段打表)

    显然只需要算出每个数比前面所有数大的期望然后全部加起来就好了,一个数的期望怎么算呢? 对于一个数我们需要考虑比它大的数,因为比它小的数放它前面放它后面都可以,但是比它大的数只能放它后面.考虑大于等于它 ...