上篇主要有以下论点:
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子系存储方式。

utf-8子系存储方式(下)相关推荐

  1. 存储方式与介质对性能的影响

    摘要 数据的存储方式对应用程序的整体性能有着极大的影响.对数据的存取,是顺利读写还是随机读写?将数据放磁盘上还将数据放flash卡上?多线程读写对性能影响?面对着多种数据存储方式,我们如何选择?本文给 ...

  2. citrix 文件服务器,Citrix Xendesktop各模式下虚拟桌面文件及用户个人数据存储方式...

    <Citrix Xendesktop各模式下虚拟桌面文件及用户个人数据存储方式>由会员分享,可在线阅读,更多相关<Citrix Xendesktop各模式下虚拟桌面文件及用户个人数据 ...

  3. Emoji输入法表情过滤,方式mysql存储不下

    package charset; import org.apache.commons.lang.StringUtils; /** * 输入法表情过滤,方式mysql存储不下,目前mysql只能支持1- ...

  4. Oracle 数据类型及存储方式

    Oracle 数据类型及存储方式  袁光东 原创  概述  通过实例,全面而深入的分析oralce的基本数据类型及它们的存储方式.以ORACLE 10G为基础,介绍oralce 10g引入的新的数据类 ...

  5. Oracle 数据类型及存储方式(袁光东 原创)

    概述 通过实例,全面而深入的分析oralce 10G的基本数据类型及它们的存储方式.从实用和优化的角度出发,讨论每种数据类型的特点.从这里开始oracle之旅! 第一部份 字符类型 §1.1 char ...

  6. Docker存储方式选型建议

    注:本文来源于网络分享 [编者的话]Docker存储方式提供管理分层镜像和容器的可读写层的具体实现.最初Docker仅能在支持AUFS文件系统的Ubuntu 发行版上运行,但是由于AUFS未能加入Li ...

  7. DockOne微信分享(八十五):Docker存储方式选型建议

    本文讲的是DockOne微信分享(八十五):Docker存储方式选型建议[编者的话]Docker存储方式提供管理分层镜像和容器的可读写层的具体实现.最初Docker仅能在支持AUFS文件系统的Ubun ...

  8. postgresql TOAST存储方式

    postgresql为"大字段"的物理存储提供了TOAST功能,通过合适的配置策略能够减少IO次数和扫描块数,进而提升查询速度. TOAST:The Oversized-Attri ...

  9. 【C语言】浮点型数据在内存中的存储方式

    目录 一. 前言 二. 问题的引出 三. 两类浮点型数据(float.double)在内存中的存储方式 3.1 两类浮点型数据的存储模型 3.1.1 浮点型数据数值读取的通用模型 3.1.2 floa ...

最新文章

  1. Python.Paste指南之Deploy(1)-概念
  2. python编程小游戏-10分钟用Python编写一个贪吃蛇小游戏,简单
  3. const、static型数据在内存中如何存储?(变量存放位置)
  4. 《零基础入门学习Python》学习过程笔记【016列表,元组,字符串的转化及共用技巧】...
  5. system v 消息队列(二)
  6. python基础教程书籍-python基础教程书籍名著日本
  7. js正则表达式校验手机号码和电话号码
  8. 台式计算机的安规测试要求,美国EPA发布能源之星计算机规范V8.0版
  9. 帝国cms7.2通过数据库修改用户密码
  10. 自建云存储:Nextcloud vs. ownCloud vs. Seafile
  11. java 二维码原理以及用java实现的二维码的生成、解码
  12. n个元素的全排列(递归+去重)
  13. c语言阿拉伯数字转大写,c++阿拉伯数字转化为中文大写
  14. 无法访问计算机请检查名称的拼写,Win7访问共享文件夹提示“请检查名称的拼写”怎么办?...
  15. 基于JavaWeb SSM mybatis 私人健身房系统管理平台设计和实现以及文档报告
  16. java se7 新特性_Java SE7新特性之try-with-resources语句
  17. rockchip rk3368(px5)车载开发之路2,屏幕正常显示(不对的地方是UI)
  18. 18.字符串练习---判断是否是回文数
  19. 年终奖怎么发才比较合理?
  20. 如何将不能下载及不能缓存的视频下载到本地电脑—解决方法

热门文章

  1. Roguelike+单机玩法游戏保护案例
  2. UltraEdit 15.10 注册码
  3. K210识别数字(0~9)并与单片机通信通过数字来控制小车移动
  4. koa - 洋葱模型浅析
  5. 流光溢彩 diy_您需要的只是流光溢彩
  6. android的adb介绍,Android开发基础不牢
  7. TikTok涨粉?参考抖音?账号增粉解析!
  8. c++ 每个类都有一张虚方法表
  9. dhcp显示否服务器怎么设置,怎么开启 dhcp服务器配置
  10. 比上清华更难的,是加入这支中国顶级黑客战队