文件中的字符编码的层次

以前只是模模糊糊的知道ASCII,Unicode之类的概念,汉字占两字节啦诸如此类,如何编码的问题并未深究,这次开始填坑了^_^
(多为对Wiki的个人总结,如有疑惑以Wikipedia为准)

Wiki中把“字符集”和“字符编码”两个名词都归在“字符编码”词条下。初一看,似乎不妥,但是解释了字符集就解释了字符编码,解释了字符编码,字符集的概念也很明了了,所以也不无不可。

现代的字符编码体系将字符编码分为五层,分别为抽象字符集,编码字符集(CCS),字符编码表(CEF),字符编码方案(CES)和传输编码语法。中间三个可以概括为字符映射过程,也是字符从具象转换为以字节为单位的编码机制。

1. 抽象字符集
这相当于所有字符组成的大池子,表示一种字符集(不考虑实现)的整体,它是受到系统级支持的。比如最初的字符集只有英文字母以及标点,如今抽象字符集的涵盖面就大大拓宽了。
2. 编码字符集(CCS)
CCS和抽象字符集的关系可以理解为数组和集合的关系。集合无序,数组有序。CCS将抽象字符集排序,可以是一维的也可以是多维的。比如’A’被赋予65这个整数,或者汉字被赋予一个整数对。这些数组的“下标”称为码位值(code point),由此产生编码空间的概念。比如,GB 2312的编码空间大小为94*94,编码空间一定程度上代表了该类字符集能表示字符的个数。
Note: 由于顺序可以不同,相同的抽象字符表可以产生不同的编码字符集。Unicode个人认为更侧重于CCS,而UTF-8,UTF-16…更接近下文提到的CEF和CES。
3. 字符编码表(CEF)/storage format
CEF比CCS更接近字符在系统底层的表示形式。CEF的作用是将码位值转换成码元(马原。。。蛤蛤蛤),码元一般是定长或变长的二进制数/二进制数对。这种转换可以看做一个映射,而且大多数情况下,这是一个到自身的映射。定长还是变长,这里面就很有讲究了。暂且留在解释UTF-8,UTF-16时讲。
4. 字符编码方案(CES)/serialization format
我们得到了码元还远远不够,因为字节才是现代操作系统储存的基本单位,将码元映射到8位字节序列(8的倍数),才能最大程度节省空间。ASCII由于设计时就将字符限定在 271 个,在这一步上没有任何问题,对于Unicode来说,这是至关重要的一环。
5. 传输编码语法
用于处理数据传输时的字节序列(不同于字节序。。。看到这个词我还专门查了下wiki,看的一头雾水:和字符编码有什么鬼关系!)这非常好理解,比如只能以英文字符的方式传输含有表情等内容的文件,我就先将该文件经过2,3,4这几个步骤转换为一个一个二进制数,然后用既定的语法进行“翻译”。
比如ASCII中’S’的字节码为:01010011,我们转换为只用小写字母a,b,c,…,o,p来编码(凑齐16个啦)

0 1 0 10 0 1 1
fd

也就是说,我们能用”fd”表示’S’。虽然看上去很酷,但本质只是不同进制的转换,然后找字母而已。。。
Base64编码的基本原理就是如此,详细请见Wiki。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值