基本概念¶
-
文本:指计算机中的文字信息,是计算机中最常用的一种数字媒体,由一系列 “字符”组成
-
字符:各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等
-
字符集:多个字符的集合,字符集种类较多,每个字符集包含的字符及个数不同
-
字符编码:也称字集码,就是把字符集中的字符,编码为指定集合中某一对象,以便文本在计算机中存储和通过通信网络进行传递,即字符的二进制表示,为了方便,一般以**十六进制**表示(计算机内部存储仍然是二进制)
文本分类¶
- 简单文本(纯文本):.txt 没有字体、字号的变化,无图片和表格,也不能建立超链接,由一串用于表达正文内容的字符编码所组成,几乎不包含任何其他的格式信息和结构信息
-
丰富格式文本:.doc、.rtf、.htm、.html、.pdf 有字体、字号等属性变化、设置了段落和页面排版格式的文本,包含的信息更多,表现力更强,除了正文内容之外,还使用了许多“标记”来描述字符的属性和格式的设置,如word文档
-
超文本(www网页):.doc、.rtf、.htm、.html、.pdf、.hlp 也属于丰富格式文本,除富文本特征外,文本中还含有超链,使文本呈现为一种网状结构
编码与解码¶
编码:根据字符集映射,将字符转换为对应字符编码。如中文字符“癌”的gb2312编码为“B0 A9”。
解码:根据字符集映射,将字符编码转换为对应字符。如gb2312编码“B0 A9”对应的字符为“癌”。
西文字符编码¶
☆ASCII字符集¶
ASCII码(America Standard Code for Information Interchange),即美国信息交换标准码。它已被国际标准化组织(ISO)定为国际标准,称为ISO 646标准。适用于所有拉丁文字字母。
- 标准ASCII码 使用指定的**单字节7位二进制数**组合来表示\(2^{7}\)个字符,即0000 0000 B ~ 0111 1111 B来表示128个字符,对应的十进制范围为0~127,对应的十六进制范围为**00 H~7F H** 国际上最通用的西文字符编码,是目前计算机中,特别是微型计算机中使用最普遍的字符编码集
| ASCII码(二进制) | 十进制 | 十六进制 | 字符 | 数量 |
|---|---|---|---|---|
| 0011 0000 B ~ 0011 1001 B | 48 ~ 57 | 30 H ~ 39 H | 数字0~9 | 10 |
| 0100 0001 B ~ 0101 1010 B | 65 ~ 90 | 41 H ~ 5A H | 大写字母A~Z | 26 |
| 0110 0001 B ~ 0111 1010 B | 97 ~ 122 | 61 H ~ 7A H | 小写字母a~z | 26 |
| 0000 0000 B ~ 0001 1111 B | 0 ~ 31 | 00 H ~ 1F H | 控制字符 | 32 |
| ... | ... | ... | 通用字符 | 34 |
- 扩展ASCII码 为充分利用字节的每一位,在标准ASCII码的基础上,使最高位为1的编码。使用二进制数1000 0000 B ~ 1111 1111 B来表示额外的128个**不常用字符**,对应的十进制范围为128~255,对应的十六进制范围为80 H ~ FF H
中文字符编码¶
☆GB2312字符集¶
该标准于1980年发布,1981年5月1日开始实施,适用于汉字处理、汉字通讯等系统间的信息交换,通行于中国大陆,新加坡等地也采用。该标准划分94个区,每个区内有94个位,用来对应3755个一级汉字、3008个二级汉字以及682个非汉字字符,其余部分空白。其中,区号和位号各用一个字节存储,所以用该标准来**存储1个汉字需要2个字节。**自2017年3月23日起,该标准转化为推荐性标准:GB/T2312-1980,不再强制执行。
| 区 | 字符 | 数量 |
|---|---|---|
| 01~09 | 特殊符号、数字、英文字符、制表符等非汉字字符 | 682 |
| 10~15 | 空区,留待扩展 | |
| 16~55 | 常用汉字(一级汉字),按拼音排序 | 3755 |
| 56~87 | 非常用汉字(二级汉字),按部首笔画排序 | 3008 |
| 88~94 | 空白,留待扩展 |
-
外码(输入码、输入法编码) 用来将汉字输入到计算机中的一组键盘符号,作为汉字输入用的编码,英文字符则无需输入码
-
数字编码:如区位码
-
拼音编码:如全拼、双拼、自然码等
-
字形编码:如五笔、表形码、郑码等
-
区位码 区号(0194)与位号(0194)的组合,区号和位号各自独立 十进制:01 01 ~ 94 94 二进制:00000001 00000001 B ~ 01011110 01011110 B 十六进制:01 01 H ~ 5E 5E H
-
国标码(交换码)= 十六进制区位码 + 20 20 H 是汉字信息交换码,即不同的具有汉字处理功能的计算机系统之间在交换汉字信息时所使用的代码标准。为了避免与通讯时使用的控制字符编码冲突,即ASCII码中0~31,因此规定每个汉字的区号和位号都必须加32,此即国标码 十进制:+32 32→ 33 33 ~ 126 126 二进制:+00100000 00100000 B → 00100001 00100001 B ~ 01111110 01111110 B 十六进制:+ 20 20 H → 21 21 H ~ 7E 7E H
-
机内码 = 十六进制国标码 + 80 80 H = 十六进制区位码 + A0 A0 H 是计算机内部识别汉字的编码,为了与标准ASCII码区别,将国标码的区号和位号最高位变为1,即都加上128 ****十进制:+128 128 → 161 161 ~ 254 254 二进制:+10000000 10000000 B→ 10100001 10100001 B ~ 11111110 11111110 B 十六进制:+80 80 H → A1 A1 H ~ FE FE H
-
字形码(字模码、输出码) 属于点阵代码。将一个汉字放入n行m列的点阵中,每个小格以1位二进制表示,有笔画经过的方格值为1,否则为0 一个n行m列的点阵存储一个汉字占用的字节数 = \(n \times m\div 8\)
如“癌”字位于第16区的第09位 区位码 = 16 09 D = 10 09 H 国标码 = 10 09 H + 20 20 H = 30 29 H 机内码 = 30 29 H + 80 80 H = B0 A9 H
BIG5(CNS 11643)字符集¶
既是字符集又是字符编码。通行于我国台湾、香港地区的一个繁体字编码方案,俗称“大五码”。B1G-5编码是一个**双字节编码**方案,收录的符号408个,汉字13053个,1984年实施。
GBK字符集¶
1995年12月发布的汉字编码国家标准,是**对GB2312编码的扩充**,对汉字采用**双字节编码,只要求高8位(第一个字节)大于127,不再要求低8位,只要碰到大于127的即代表一个汉字的开始,应往后读取两个字节**。GBK字符集共收录21003个汉字和883个图形符号,包含国家标准GB13000-1中的全部中日韩汉字,和BIG5编码中的所有汉字。
GB18030字符集¶
2000年3月17日发布的汉字编码国家标准,是**对GBK编码的扩充**,覆盖中文、日文、朝鲜语和中国少数民族文字,其中收录27484个汉字。GB18030字符集**采用单字节、双字节和四字节三种方式对字符编码**。兼容GBK和GB2312字符集。2005年11月8日,发布了修订版本:GB18030-2005,共收录汉字七万余个。2022年7月19日,发布了第二次修订版本:GB18030-2022,收录汉字总数八万余个。目前已在我国信息处理产品中强制贯彻执行。
-
单字节编码:表示128个ASCII字符
-
双字节编码:表示23940个汉字,与GBK、GB2312向下兼容
-
四字节编码:表示 约158万个UCS/Unicode中的其他字符
△统一字符编码(Unicode字符集)¶
Unicode字符集(编码)又称为**统一码**、万国码,定义了这个世界上几乎所有字符的表示,以满足跨语言、跨平台进行文本转换、处理的要求。而且Unicode还兼容了很多老版本的编码规范,例如ASCII码。
码点:Unicode给每个字符分配的数字ID,且具有唯一性,通常写成U+ABCD的格式。UCS-2是用两个字节来表示码点,其取值范围为 U+0000~U+FFFF;UCS-4用四个字节表示码点,范围为U+00000000U+7FFFFFFF,其中U+00000000U+0000FFFF和UCS-2是一样的。(ASCII码对应的字符的码点与其十六进制ASCII码完全一致)
Unicode字符集可以根据不同需要以UTF-8、UTF-16、UTF-32等方法编码,它的实现方式称为**Unicode转换格式(Unicode Transformation Format, UTF)**。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。
UTF-16¶
完全对应于**UCS-2**,用**2个字节**进行存储,即用00000000 00000000 B ~ 11111111 11111111 B来表示存储字符,十六进制范围为00 00 H ~ FF FF H,共可表示\(2^{16} = 65536\)个字符,但**涵盖范围仍然较小**
-
UTF-16BE
-
UTF-16LE
-
UTF-16(Big Endian)
-
UTF-16(Little Endian)
-
UTF-16(不带标记)
如字符"A",对应十六进制ASCII码为41 UTF-16BE:00 41 H UTF-16LE:41 00 H UTF-16(Big Endian):FE FF 00 41 H UTF-16(Little Endian):FF FE 41 00 H UTF-16(不带标记):00 41 H
UTF-32¶
由于UCS-2仍然不能囊括世界上所有的字符,所以提出了UCS-4,UTF-32完全对应**UCS-4**,采用**4个字节**来表示,十六进制范围为00 00 00 00 H ~ FF FF FF FF H,共可表示$2^{32} = 4294967296 $个字符,基本上能涵盖世界上所有的字符。但所**占用的存储空间较大**,不被广泛接受。如一个字符通过ASCII码本可以用1个字节进行存储,若采用该编码则需要占用4个字节的空间
-
UTF-32BE
-
UTF-32LE
-
UTF-32(Big Endian)
-
UTF-32(Little Endian)
-
UTF-32(不带标记)
如字符"A",对应十六进制ASCII码为41 UTF-32BE:00 00 00 41 H UTF-32LE:41 00 00 00 H UTF-32(Big Endian):00 00 FE FF 00 00 00 41 H UTF-32(Little Endian):FF FE 00 00 41 00 00 00 H UTF-32(不带标记):00 00 00 41 H
UTF-8¶
UTF-8编码是在互联网上使用最广的一种Unicode实现方式,它是一种**可变长的编码方式**,它可以使用**1~4个字节**表示一个符号,根据不同的符号而变化字节长度。根据UCS-4码点范围对应的UTF-8格式,将二进制编码从低位往高位进行填充。
| UCS-4(UCS-2) | UTF-8 |
|---|---|
| 00 00 00 00 H ~ 00 00 00 7F H | 0xxxxxxx |
| 00 00 00 80 H ~ 00 00 07 FF H | 110xxxxx 10xxxxxx |
| 00 00 08 00 H ~ 00 00 FF FF H | 1110xxxx 10xxxxxx 10xxxxxx |
| 00 01 00 00 H ~ 00 10 FF FF H | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
对于标准ASCII码对应的字符在UCS-4中对应的编码仍为00 00 00 00 H ~ 00 00 00 7F H,因此这些字符仍采用1个字节进行存储,按格式填充后二者完全一致
如西文字符"A",对应十六进制ASCII码为41 H,UCS-2码点为00 41 H,UCS-4码点为00 00 00 41 H,属于00 00 00 00 H ~ 00 00 00 7F H 二进制码点:00000000 00000000 00000000 0**1000001** B UTF-8:0**xxxxxxx** → 0**1000001** B → 41 H
如中文字符“王”,对应的UCS-4码点为00 00 73 8B H,属于00 00 08 00 H ~ 00 00 FF FF H 二进制码点:00000000 00000000 01110011 10001011 B UTF-8:1110**xxxx** 10**xxxxxx** 10**xxxxxx** B ****→ ****1110**0111** 10**001110** 10**001011** B → E7 8E 8B H









