utf-8子系存储方式(下)

在这里插入图片描述
上篇主要有以下论点:
1、utf-8编码状态符”0”“10”置换,这一措施损失最大的一方将是ascall码。因为ascall字符系统有128个字符,如果状态符为“0”时,第一字节刚好存储整个ascall码字符系统,如果状态符置换为“10”,那么将会有一半的字符“被贬”第二字节,这一半字符在存储的时候将会增加一倍的存储量。而这一置换第二字节存储量是之前的2倍,第三字节存储量是之前的4倍,第四字节存储量是之前的8倍。
2、彩虹排序,在一个变长存储的字符系统中,如果按照命中率和使用率来进行字符编码排序,会无形的节约存储空间。即便节约不了空间,在查询时也会约束查询区间,在指定区域搜索,增加查询效率。
3、协议字符,由于“0”和“10”置换之后,会额外多出一个值槽夹层,出现很多的编码空位,利用协议字符的形式,将多个字符的组合形式以协议来约定编码。如第二字节值槽夹层有2048个空位,可以约定字符组合填入空位。“static”词语编码为2049,然后填入对应的值槽空位。协议字符是将两个或者多个字符合并为一个字符,这里的字符和字符编码不同,字符属于字符系统,而字符编码是给某个字符一个唯一的编码。字符合并是在存储的角度来说的,字符合并并不代表之前的字符消失,各个字符仍然各自独立,与协议字符共生,不过字符在应用时为同一个编码来存储。
4、《第一字节协议》,第一字节协议是为了状态符“0”“10”转换之后将常用的字符以置换的方式编入第一字节来降低损失。第一字节一共64个空位,将52个常用拉丁字母(大小写)、10个阿拉伯数字、一个空格、一个null纳入第一字节。Ascall码中,10个阿拉伯数字、一个空格、一个null编码已经在前063的范围中,需要建立104条协议,将52个拉丁字母(大小写)纳入置换后的第一字节。此协议只在范围为0127的编码,且不在32和48~57范围之内生效。
5、汉字与英文单词的比较,汉字常用字符有2万多个,英文单词有52个字符。在utf-8存储时,一个英文字符占一个字节,一个中文占3个字节。在书写时,汉字以等长紧密的排列,而英文单词需要加上空格来作为单词的结束标志。英文字母很类似中文中的偏旁部首的基本笔画。汉字由偏旁部首和文字结构组成,相比于英文单词大大节约了空间。单个汉字与英文单词的释义都有多种,放在上下文中会有固定的意思,它们有相似的功能。然而在文字书写上,汉字有明显的优势。单个汉字字符占3个字节,而一个单词占单词长度加空格即n+1个字节。如果令3>n+1,那么n只能小于2,也就只能是1。因此,除非是1个字母为单词存储会比汉字存储空间小之外,大于2个字符的英文单词存储方面会略逊于汉字,因为汉字字符是由偏旁部首和文字结构组成,每个字符都已经赋予了释义。

从utf-8追溯到Unicode,从Unicode追溯到计算机编码,再追溯到字符系统。英语、法语、中文、日文、阴阳爻、八卦、六十四卦、计算机编码、进制都称之为字符系统。变长存储的单词是西方人的习惯,方块字是东方人的习惯。在信息量极大的古代,为了知识传播,中国想方设法的节省书写方式,字符合并很早产生于汉字中,周易也是如此。“逸马杀犬于道”就是典型的简化知识内容的例子。我时常在想,在欧洲没有活字印刷术之前,由于英文单词本身的长度限制了载体存储文字的容量,也影响了知识的传播速度。而在宋以前的中国同样没有活字印刷术,中文以其独特的结构和良好的文字表达能力,会比英文知识更利于传播,这对于东西方社会知识的普及度和社会发展也有一定的影响。

数据以合理的方式存储会节约存储空间,在古代可以影响知识的传播速度,在现在也可以节约存储带来的经济开销,因此节约是一件有益的事情。当我看到utf-8的第一字节标识符为“0”,双字节的次字节为“10”时,想到的是为什么不去“0”和“10”置换呢?这样可以存储很多的空间。可能是由于历史原因,第一字节的状态符为“0”,这也保留了第一字节完整的ascall码,也非常节约ascall码的的存储空间。也许还有一个很重要的点,就是即便置换出来了一亩三分地,能做什么用呢?如果还是按照以往的方式进行字符编码分配,还反倒很麻烦,也损失了ascall码的存储效率,没有实质性的优化进展。而协议字符可以在“0”“10”置换后带来实质性的空间节约,但是协议字符怎样分配效率最高呢?在不用的应用场景中,能不能去做一些适当的调整呢?我想到的是给utf-8分子系编码存储方式,就像Unicode分utf-8、utf-16、utf-32一样给utf-8分子系,比如utf-8-Chinese(中文优先分配方式)、utf-8-English(英文优先分配方式,兼容《第一字节协议》)、utf-8-Chinese-FBP(兼容《第一字节协议》的utf-8-chinese)。

utf-8-Chinese(中文优先分配方式)编码存储方式,在“0”“10”置换后,以中文优先。首先在第二字节多出来的2048个值槽中填入最常用的2048个汉字。这样一来原先在第三字节的汉字被移入第二字节,存储时节约一个字节的存储单位,这2048个汉字可以直接节约33%存储空间。这就需要像《第一字节协议》类似的,建立《第二字节中文协议》,来保证最常用的2048个汉字可以正常置换到第二字节。此协议在基本中文编码的范围(ox4e00~ox9fa5)生效,保证可以正常的与Unicode和utf-8自由转换。

其次,第三字节会多出196608个空位,可以将中国最常用的词语以“协议字符”的形式存储,如将“我们”一词约定为一个空位的编码,“中国”“改革”“政治”“经济”“文化”等等以此类推,最常用的词语以3个字节的存储单位存入也会节约一定的空间。第三字节空位纳入的词语越多,越节约空间,但是也会扩大搜索范围。因此适度纳入最为合理,比如纳入10000或者5000个常用词语。此词语最好按照使用频率编排编码,制定一个范围建立《第三字节中文词语协议》。在指定范围之内的编码读取时协议生效,读取时将对应的一个编码拆分为独自Unicode中文字符显示。另外还可以在多余的空位中指定一个区间存储成语“协议字符”,与词语同理。

utf-8-Chinese(中文优先分配方式)编码存储方式的《第二字节中文协议》类似于GBK,以2个字节存储中文,但是又解决了GBK编码不兼容Unicode编码的问题。utf-8-Chinese相当于utf-8、GBK、“协议字符”的混合方式,此种方式有利于提高中文的存储效率。

utf-8-Chinese-FBP(兼容《第一字节协议》的utf-8-chinese)是为了在存储中文的同时不损失英文存储效率而引进《第一字节协议》,这样可以缓解和弥补ascall码损失的存储效率。

utf-8-English(英文优先分配方式,兼容《第一字节协议》)编码存储方式,在“0”“10”置换后,以英文优先。首先在第二字节多出来的2048个值槽可以以“协议字符”的形式填入最常用的2048个英文单词。比如开发语言的关键字、最常用的英文单词等等,与《第二字节中文协议》同理,建立《第二字节英文单词协议》,指定连续的区间范围,在此区间范围内生效。英文单词在存储是有一个很大的优势就在于以空格为结束标志,很容易判断单个的英文单词,这样在存储时很容易做到识别单词,读取时再根据“协议字符”协议拆分为对应的一组Unicode英文字符。以往英文单词存储字节为n+1(n代表单词的字符长度),而在《第二字节英文单词协议》中的单位存储字节为2+1,这样英文存储也可以节约很多的空间。最常用的中文和最常用的英文单词可以囊括很大一部分常用的书写内容,也意味着会节约很多的空间。

第三字节和第二字节类似,存储常用的英文单词,也同样建立对应的读写协议和指定连续区间范围,第三字节还可以类似于中文成语,指定一个连续区间建立都区协议用来存储常用的英语俚语。

向以上一样,不仅中文和英文,其他国家的语言如德语、法语、日语、俄罗斯语、巴西语、阿根廷语、腓尼基语、阿拉伯语都可以在utf-8存储方式状态码”0””10”置换的基础上,建立各自的协议来指定自己的文字存储方式。Unicode之前各个独立的语言系统编码各不兼容,带来了很大的问题,这才有了Unicode的诞生。而在此种方式的基础上,多多少少可以带来存储上面的节约,而且可以自由的转为utf-8和Unicode,为存储节约成本。

以上,都是建立在utf-8存储方式的基础上,建立变长存储的存储方式,且都可以转为utf-8存储方式,虽然各自语言协议和算法不同,但是都可以根据Unicode或者utf-8打通各自之间相互转换。因此将这些编码方式称之为:utf-8子系存储方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值