自己设计的关于Unicode的编码方案
Tofloor
poster avatar
lonelong
deepin
2019-02-15 11:33
Author
本帖最后由 lonelong 于 2019-2-17 17:55 编辑

已有第二版。



因为我觉得UTF-8编码仅仅对00000000-0000007F编码占用空间小。假如有大量连续字符在UCS-4编码当中的前三个字节都一样,那么使用UTF-8编码也会浪费至少一倍的空间。


简单介绍下我的编码方案:
编码最多占用5个字节:D4D3D2D1D0。
D4表示控制信息(b7b6b5b4b3b2b1b0)。b7永远为1,b3b2b1分别表示UCS-编码下当前字符跟前一个字符的前三个字节比较的结果,相同为0,不同为1;b0表示UCS-编码下当前字符跟前一个字符的最后一个字节的最高bit比较结果,相同为0,不同为1。b6b5b4未定义。
D3D2D1与当前字符UCS-4编码前三字节相同。

D0表示当前字符UCS-4编码的最后一个字节低7bit,最高bit永远为0。
若D4的b3b2b1b0全为0,则D4D3D2D1省略,只保留D0。
若D4的b3b2b1某一位为0,则对应字节省略。
D0不可省略,且最高bit永远为0。
文本文件或字符串开头默认前一个字符的UCS-4编码为00000000。


这种编码的优点:
如果UCS-4编码下当前字符与前一字符的前3字节相同,则编码仅占用1个字节。所以兼容ASCII编码。


缺点:
当前字符的编码要跟前一个字符的UCS-4编码比较。


我简单测试了一下,汉字、阿拉伯文字、韩文、俄文、日文,用这种编码跟UTF-8编码所占用空间差不多。但是泰文,比UTF-8小很多。


后缀“utfc”的文件就是经过此方案编码后的文件。“jieguo.ucs4”是解码“utfc”得到的文件。


自己写了个小程序用来编码和解码,没有优化,没有注释。

UTF-C.zip
“UTF-C”是我自己临时乱起的名字。



请各位指出这种编码方案的缺点和不足。
如果是小的不足,可以改进。如果是非常大的缺点,那就只能放弃了。

谢谢各位!

-----------------------------------------------------------------------------------

百科https://baike.baidu.com/item/Unicode/750500?fr=aladdin#11最下边编码当中的所有字保存为:
连续编码的汉字.zip
共6081个汉字。


我对外语不了解。如果有某种文字像ASCII码一样,编码集中在UCS-4最后一字节的0000~07FF或8000~FFFF内,此方案占用空间跟相同字符数量的纯ASCII文件相比,只多占用一字节。

----------------------------------------------------------------------------------

编码说明:



编码举例:


Reply Favorite View the author
All Replies
avatar
bibichuan
deepin
2019-02-15 16:50
#1
编解码是不是也有效率的考虑?不是很懂,认真思考了,值得尊敬。
Reply View the author
avatar
wvb
deepin
2019-02-15 17:23
#2

认真思考了,值得尊敬。
我比较外行,编码应该是对应查表吧,不压缩的话应该不能依赖上一个字符是啥吧,这应该算是压缩算法了吧。
我单纯好奇,上一个字符如果存储或者传输出错了怎么办呢?跟着就一路错么?容错是不是就很差了呢?
Reply View the author
avatar
fengjl
deepin
2019-02-15 17:35
#3
编码行不行还要看看大的环境,别人都是流行的编码,你弄个特立独行的交流起来很麻烦,这个是最大的麻烦
Reply View the author
avatar
lonelong
deepin
2019-02-16 02:51
#4
https://bbs.deepin.org/post/174736
编解码是不是也有效率的考虑?不是很懂,认真思考了,值得尊敬。

我先给你讲个笑话:
我也不懂。

1、文件的存储时间总是远远大于转换时间,只要转换的时间在容忍的范围内就可以。
2、我写的垃圾代码仅仅是实现了我想要的功能。对于同一个功能,肯定会有不同算法。现在只考虑编码规则。
3、Unicode本身是好的,但是UTF-8让我觉得不舒服。在占用空间上,它把ASCII放在了至高无上的位置,难道Unicode编码越靠后的字符就必须占用更多的空间吗?我总感觉这种方案带有某种歧视。
Reply View the author
avatar
lonelong
deepin
2019-02-16 02:54
#5
https://bbs.deepin.org/post/174736
认真思考了,值得尊敬。
我比较外行,编码应该是对应查表吧,不压缩的话应该不能依赖上一个字符是 ...

存储和传输出错,应该是数据链路层和物理层解决的问题。
否则我们就要考虑万一CPU做加法的时候出错了并且没有产生错误中断该怎么办呢?
Reply View the author
avatar
lonelong
deepin
2019-02-16 02:58
#6
https://bbs.deepin.org/post/174736
编码行不行还要看看大的环境,别人都是流行的编码,你弄个特立独行的交流起来很麻烦,这个是最大的麻烦 ...

大侠,好一招隔山打牛!
我给你翻译一下啊:
系统行不行还要看看大的环境,别人都是流行的Windows,你弄个特立独行的DDE交流起来很麻烦,不了解问题重点就各种反对是最大的麻烦。
Reply View the author
avatar
jhkwei
deepin
2019-02-16 06:30
#7
最好画一张图,不然看起来看不懂.
Reply View the author
avatar
lonelong
deepin
2019-02-17 03:17
#8
https://bbs.deepin.org/post/174736
最好画一张图,不然看起来看不懂.

更新了2张图,如果还没明白,我再解释。
Reply View the author
avatar
WangZhongyun
deepin
2019-02-17 04:34
#9
按讲在合适的编码规则下,不需解码的一符号一码最好
Reply View the author
avatar
cosct
deepin
2019-02-17 06:11
#10
https://bbs.deepin.org/post/174736
按讲在合适的编码规则下,不需解码的一符号一码最好

你说的就是Unicode啊
Reply View the author
avatar
cosct
deepin
2019-02-17 06:14
#11
楼主你发明的算是一种压缩编码的算法了,新的编码方案意义不大,目前的编码方式已成为通用标准,不太可能轻易改动了
Reply View the author
avatar
jhkwei
deepin
2019-02-18 03:05
#12
https://bbs.deepin.org/post/174736
更新了2张图,如果还没明白,我再解释。

大体明白,相比utf8,utf8在编译文件损坏情况下还是可以找下一个字符开头,utf8 应该是一种传输格式,还有对于linux api 的char * 参数可无修改对接的。至于储存空间会用别的通用压缩方法,应该比你想的压缩方法差,还有你这个压缩可以算出来的,只有几种情况,粗略估计会和utf8相当,不会有明显优势。
Reply View the author
avatar
wvb
deepin
2019-02-18 17:43
#13
https://bbs.deepin.org/post/174736
存储和传输出错,应该是数据链路层和物理层解决的问题。
否则我们就要考虑万一CPU做加法的时候出错了并且 ...

确实是数据链路和物理层该解决的问题。
但是,原来的编码在其他层面出错了,不至于全部完蛋。现在的编码就不同了。
在容错机制比较脆弱的情况下,也许会酿成一些灾难,虽然出错不一定在你。

你可以参考视频编码,加一些k-frame。

我觉得是可以做出来作为一种参考方案存在的,流行得起来就看实践了。
实践是检验真理的标准。
Reply View the author