1. 什么是字符

字符是书写的最基本构建单元。字符可以表示字母、数字、标点、表意符号(比如汉字)、数学符号,或者其他的书写基本单元。

不能把字符和字形相混淆。字符是唯一的,抽象的语言“原子”。字形是画出每个符号时使用的特定方式。只有当用一种字形替代另一种字形,文本的意思发生了改变,才把这些字形看成是不同的字符。否则,这些字形就是同一个字符的不同风格的表示形式。

比如上图中的九个字形,虽然形状各异,但一看就知道是小写字母a,所以这九个字形代表的是小写字母a这同一个字符。

2. 编码后的字符集(coded character set

编码后的字符集将整数映射到字符。编码后的字符集经常用数组来实现,通过代码数值来进行索引。数组的元素就是字符。下面举例说明一些常见的编码后字符集。

1) US-ASCII

ASCII表示“美国标准信息交换代码”(American Standard Code for Information Interchange)。ASCII是最著名的编码后字符集,早在1968年就由ANSI进行了标准化。ASCII的代码值范围是0到127(用十六进制表示是0x00到0x7F),因此只需7个二进制码就可以覆盖整个代码空间。ASCII的推荐名称是US-ASCII,这样可以和那些7位字符集的一些国际化变体进行区分。HTTP报文(首部、URI等)使用的字符集是US-ASCII。

2) iso-8859

iso-8859字符集标准是US-ASCII的8位超集,使用二进制码的高位增加了一些国际化书面字符。有额外的二进制码增加的空间(多了128个代码,从0x80到0xFF)还不够大,甚至还不够所有的欧洲字符使用,更不用说亚洲字符了。因此iso-8859为不同地区定制了不同的字符集。其中最著名的就是iso-8859-1,用于表示西欧语言(英语、法语等)。iso-8859-1的别名是Latin1,是HTML的默认字符集。

3) UCS

UCS(Universal Character Set)把全世界的所有字符都整合到了单一的编码后字符集中。UCS由ISO 10646定义。Unicode是遵循UCS标准的商业化联合组织。

在UCS标准中,代码空间被分成了17个平面(planes),每个平面有65536(2的16次方)个代码点(code points),所以总共有1,114,112个代码点。这个数字很奇怪,因为它不是2的幂。这其实是UTF-16编码方案的设计所造成的结果。

在UTF-16中,用两个代码单元(共四个字节)组成的“代理对”(surrogate pair)来编码1到16平面中的2^20个代码点(2^4个平面乘以每个平面2^16个代码点),而对0平面进行编码只需要一个代码单元(两个字节)。2^20 + 2^16 = 1024^2 + 65536 = 1114112。

UCS中的第一个平面,0平面,也叫“基本多语种平面”(Basic Multilingual Plane,BMP)。这个平面是到目前为止大部分字符所在的地方。而BMP中的大部分代码点都被用于对中日韩的字符进行编码。上图中浅灰色区域中,0xD800到0xDFFF(8 * 2^8 = 2^11 = 2048)这个区域(倒数第三行后半部分)不对应任何字符,而是被保留用于在UTF-16编码方案中对代理对进行编码。

3. 字符编码方案(character encoding scheme

字符编码方案(character encoding scheme)和编码后的字符集(coded character set)不是一个概念。字符集给所包含的每个字符分配一个整数编号,而编码方案规定如何把字符的代码数字打包装入二进制的比特数据中,以及如何在另一端将其解包回字符代码。

字符编码方案主要有以下3种类型。

固定宽度

固定宽度方式的编码用固定数量的比特表示每个编码后的字符。它们能被快速处理,但可能会浪费空间。

可变宽度

可变宽度方式的编码对不同的字符代码数字采用不同数量的比特。对于常用字符,这样可以减少所需的位数,而且还能在允许使用多字节来表示国际性字符的同时,保持对传统8位字符集的兼容性。

可变宽度(有模态)

有模态的编码使用特殊的“转义”模式在不同的模态之间进行切换。例如,可以用有模态的编码在文本中使用多个互相重叠的字符集。有模态的编码处理起来比较复杂,但可以有效地支持复杂的书写系统。

1) 8位编码

iso-8859字符集家族系列使用的是8位的恒等编码。这种编码把每个字符代码直接编码为相应的8位二进制数值。这种编码方式只支持代码范围包含256个字符的字符集。

2) UTF-8

UTF-8是一种流行的为UCS设计的字符编码方案,UTF表示UCS变换格式(UCS Transformation Format)。UTF-8为字符代码值使用的是无模态的变宽编码。第一个字节的高位表示编码后字符所用的字节数,后续每个字节都固定包含6位的代码值。

如果编码后的第一个字节的最高位是0,则编码长度就是一个字节,剩余的7位就包含字符的代码。这样一来就美妙地达到了与ASCII的兼容(但和iso-8856系列不兼容)。

例如字符代码90(ASCII的“Z”)在0到127的范围内,故只需一个字节进行编码(90 = 64 + 16 + 8 + 2 = 2^6 + 2^4 + 2^3 + 2,编码为0,101,1010)。而代码5073需要13位二进制数(1,001111,010001),会被编码为3个字节(见上图第三行):

11100001  10001111  1001001

注意UTF-8的最大编码值是31位,能编码2^31个代码值,这远远大于UCS的代码范围(相当于2^15,即32768个平面)。

3) UTF-16

UTF-16编码方案能够对UCS中的1,112,064个代码点进行编码(1,114,112减去从U+D800到U+DFFF这2048个用于代理对的代码点)。UTF-16编码长度要么是两个字节(对于从U+0000到U+D7FF,以及从U+E000到U+FFFF的基本平面代码点),要么是4个字节(对于从U+1,0000到U+10,FFFF的16个辅助平面中的代码点)。

辅助平面中的代码点长度超过两个字节,用两个16位的代码单元(称为一个代理对)来进行编码,具体编码方式如下:

  • 将代码点的值减去0x1,0000,得到一个20比特的范围在0到0xFFFFF之间的数。(辅助平面本身有16 * 2^16 = 2^20个代码点。)
  • 20个比特中的头10个比特(0到0x3FF之间的数)与0xD800相加,得到第一个代码单元或者叫高位代理(lead surrogate),该值在0xD800到0xDBFF之间。
  • 低位的10个比特(值同样在0到0x3FF之间)与0xDC00相加,得到第二个代码单元,或者叫低位代理(trail surrogate),取值范围是0xDC00到0xDFFF。

从这里就能看出为什么要保留0xD800到0xDFFF这个范围了,因为0xDFFF – 0xD800 + 1等于0x800,等于2 * 2^10,即切成两半,每一半可以代理表示2^10个数,组合起来正好可以代理表示2^20个辅助平面中的代码点(2^10 * 2^10 = 2^20)。

思考一下为什么要用代理对来进行编码,而不是用4个字节直接表示辅助平面中代码点的值?

转载于:https://www.cnblogs.com/lihaiyang/archive/2013/03/16/2963631.html

字符编码相关知识总结相关推荐

  1. 计算机ucs汉字编码,字符编码基础知识 - Unicode,UCS,GBK,GB2312,UTF-8

    字符编码基础知识- Unicode,UCS,GBK,GB2312,UTF-8 最近遇到一个Unicode和UTF-8关系比较的问题,之前在处理中文显示时也遇到过类似的问题,于是花时间学习了一下,在此做 ...

  2. 计算机字符编码基础知识

    计算机字符编码基础知识 由于计算机只能识别0和1,所以字符(文字.符号)需要编码,图像.音频.视频等也需要编码.本文主要介绍字符编码,特别是与机内码相关的内容. 字符的处理涉及到下列三类编码: 输入码 ...

  3. GB2312、GBK、BIG5、Unicode及字符编码基础知识

    GB2312.GBK.BIG5.Unicode及字符编码基础知识 在搜狗的设置里面有个选项,要用户选择使用GBK还是GB2312,论坛里面常常有人要求输入法支持BIG5编码,也有人提到 Unicode ...

  4. 字符编码的知识(二)

    3.伟大的创想Unicode --不得不单独说Unicode 像天朝一样,当计算机传到世界各个国家时,为了适合当地语言和字符,设计和实现类似GB232/GBK/GB18030/BIG5的编码方案.这样 ...

  5. 通过在操作系统中实际操作,学习和理解 Unicode 编码相关知识

    我们通过在操作系统里进行一些简单的联系,可以加深对 Unicode 编码这些基础知识的理解和记忆. Windows10 操作系统下,新建一个记事本文件,输入 123ABCabc 默认的 encodin ...

  6. Base64编码相关知识总结

    Base64编码是什么? Base64,顾名思义,就是包括小写字母a-z.大写字母A-Z.数字0-9.符号"+"."/"一共64个字符的字符集,(另加一个&qu ...

  7. Turbo编码相关知识

    这段时间里,看到的一些书籍和程序中,很多都用到LDPC码,卷积码和Turbo码,刚好又在学习Turbo码,故将资料中的关于Turbo码编码的知识点加以整理.    Turbo编码进化自卷积码,在LTE ...

  8. 每个程序员的都应该了解的字符编码

     作者:科言君 链接:https://www.zhihu.com/question/20152853/answer/95576659 来源:知乎 著作权归作者所有,转载请联系作者获得授权. 在开发 ...

  9. C++ 字符编码知识转载

    基本常识 1.位和字节 说起编码,我们必须从最基础的说起,位和字节(别觉得这个过于简单不值一说,我还真见过很多个不能区分这两者的程序员).位(bit)是指计算机里存放的二进制值(0/1),而8个位组合 ...

最新文章

  1. 【Qt】Qt再学习(十四):QGraphicsView
  2. 人工智能的鱼与熊掌:精度与可解释性
  3. 9Python全栈之路系列之Win字符编码深解
  4. 电脑删除linux系统,我的电脑现在装有XP和Linux两个系统,现在想删除Linux系统,开机不用选直接进入XP。不知怎么做??...
  5. 浅谈JAVA中如何利用socket进行网络编程(二)
  6. FFMPEG学习(一)---【命令行】采集视频和音频
  7. 观点:我们为什么需要威胁情报?
  8. EVGA Precision—— 显卡超频神器 可用于调节风扇转速 降温
  9. 魔法少女小Scarlet(洛谷P4924题题解,C++语言描述)
  10. vba java 网页_通过VBA提交JSP网站的Java脚本表单
  11. proguard java enum,Proguard没有这么说就不会混淆课堂
  12. [Android] charles高级使用总结
  13. 计算机设计大赛(微课教学辅助类)国赛总结(国赛二等奖)
  14. 关于进销存软件中的几种算法
  15. 春节快过腻了?不妨关心下太空探索
  16. 深度学习概念名词解释总结
  17. CSS基础语法和盒模型
  18. 那些年啊,那些事——一个程序员的奋斗史 ——69
  19. CHROME扩展笔记之webRequest·图片拦截
  20. 极品特效HTML5动画推荐,不看的程序员后悔一辈子

热门文章

  1. 背包问题九讲 v1.0
  2. 三层之抽象工厂加反射实例
  3. 面向对象的C语言开发框架:Nesty
  4. golang中的文件读写
  5. muduo采用计时函数gettimeofday
  6. Spring cloud技术栈
  7. IP地址的分类及各类IP的最大网络数、网络号范围和最大主机数
  8. 汇编:以字符形式给出数据
  9. oleVariant序列化对象
  10. AMD加载器实现笔记(四)