【Python学习】字符编码
先说两个基础知识。
(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学习】字符编码的更多相关文章
- Python学习-字符编码, 数据类型
本篇主要内容: 字符编码 Python中的数据类型有哪些 类型的一些常用操作及方法 一.字符编码 编码解释的大部分内容摘自廖雪峰老师教程中的讲解,点击跳转. 简单介绍: 我们知道计算机只能处理数字,如 ...
- Python学习-字符编码浅析
1.什么是字符编码 既然是简述那肯定是简单明了.字符编码,看名字就是一种字符的编码格式,由于计算机内部采用二进制,想要将人类的语言字符输入到计算机就需要一种编码格式,这就是字符编码.字符------- ...
- Python常见字符编码间的转换
主要内容: 1.Unicode 和 UTF-8的爱恨纠葛 2.字符在硬盘上的存储 3.编码的转换 4.验证编码是否转换正确 5.Python bytes类型 前 ...
- Python基础-字符编码与转码
***了解计算机的底层原理*** Python全栈开发之Python基础-字符编码与转码 需知: 1.在python2默认编码是ASCII, python3里默认是utf-8 2.unicode 分为 ...
- Python的字符编码
Python的字符编码 1. Python字符编码简介 1. 1 ASCII Python解释器在加载.py文件的代码时,会对内容进行编码,一般默认为ASCII码.ASCII(American St ...
- Python常用字符编码(转)
Python常用字符编码 字符编码的常用种类介绍 第一种:ASCII码 ASCII(American Standard Code for Information Interchange,美国信息交 ...
- python 3字符编码
python 3字符编码 官方链接:http://legacy.python.org/dev/peps/pep-0263/ 在Python2中默认是ascii编码,Python3是utf-8编码 在p ...
- Python 的字符编码
配置: Python 2.7 + Sublime Text 2 + OS X 10.10 本文意在理清各种编码的关系并以此解决 Python 中的编码问题. 1 编码基本概念 只有先了解字符表.编码字 ...
- 转:Python常见字符编码及其之间的转换
参考:Python常见字符编码 + Python常见字符编码间的转换 一.Python常见字符编码 字符编码的常用种类介绍 第一种:ASCII码 ASCII(American Standard Cod ...
- 《转》Python学习(13)-Python的字符编码
转自 http://www.cnblogs.com/BeginMan/p/3166363.html 一.字符编码中ASCII.Unicode和UTF-8的区别 点击阅读:http://www.cnbl ...
随机推荐
- 【uoj#317】[NOI2017]游戏 2-SAT
题目描述 给出 $n$ 个赛车赛道和A.B.C三种赛车,除了 $d$ 个赛道可以使用所有三种赛车以外每个都只能使用给出的两种之一.另外给出 $m$ 条限制:某个赛道使用X则某另一个赛道必须使用Y.问: ...
- 【Mybatis】简单的mybatis增删改查模板
简单的mybatis增删改查模板: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE map ...
- Contest 6
A:容易发现这要求所有子集中元素的最高位1的位置相同,并且满足这个条件也是一定合法的.统计一下即可. #include<iostream> #include<cstdio> # ...
- c# partial使用
1.有2个类 class1.cs ,class2.cs 2.这2个类里面都可以定义成这样 public partial class ClassAll { } 3.结果,里面的方法都是共享的,就像 ...
- struts2拦截器和过滤器区别
1.拦截器是基于java反射机制的,而过滤器是基于函数回调的.2.过滤器依赖于servlet容器,而拦截器不依赖于servlet容器.3.拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请 ...
- 【MVVM Dev】多个具有依赖性质的ComboBox对数据的过滤
一.前言 在界面编程中,我们常常会遇到具有依赖性质的ComboBox框,比如最常见的: 省/直辖市 => 地级市/区 => 区/街道 今天就说一下在WPF的MVVM模式中如何实现该功能 二 ...
- 【BZOJ4152】The Captain(最短路)
[BZOJ4152]The Captain(最短路) 题面 BZOJ Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求 ...
- 【BZOJ1497】【NOI2006】最大获利(网络流)
[BZOJ1497][NOI2006]最大获利(网络流) 题面 BZOJ Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS& ...
- 【BZOJ2653】Middle(主席树)
[BZOJ2653]Middle(主席树) 题面 BZOJ 洛谷 Description 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整.给你 ...
- 【bzoj4591】超能粒子炮·改
Portal-->bzoj4591 Solution 首先这个模数是一个质数 然后看一下那个\(k\)和\(n\)的范围..行吧Lucas定理咯 但是如果直接求: \[ \sum\limits_ ...