CJKEncoding 一种编码算法

代码地址:https://gist.github.com/HDRorz/761c8850b91bf25d323c40eab9898c91

一、缘由

因为某一天在论坛里突然看到一种上古加密通讯语言:佛曰。至于加密了什么内容,在这里不能说。就想到最近几天搞的数据库连接字符串加密功能里用到的base64 编码。base64 编码用处广泛,可以把字节(0-255)数组转化为 ASCII 码(0-127)中的可显示字符 64 个,这个 8 位 -> 6 位的编码和解码规则简单且万能,常用于邮件(utf-7)、url 和加解密(秘钥和密文存储)。

但是 base64 有个明显的缺点,就是他的压缩率是 133%,数据内容体积就这样膨胀了。所以我想尝试解决这个问题,于是就写了这个算法。

二、实现

因为佛曰,我想到了中文字符数量多的这个特点,比 ASCII 码字符多的多。unicode 编码在 BMP 平面内划分了 U+4E00 ~ U+9FFF 这区块给 CJK(中日韩统一表意文字)。这个区块大小是 20,992,已使用 20,989。

作为一个字典映射编码算法,要考虑映射范围。1个字节是 256,2个字节则需要65536,CJK 区块显然不能满足 2个字节的映射需求。那么只能考虑把一个字节切分映射,那么就有 512、1024、2048、4096、8192、16384 这么几种选择。考虑到移位为偶数比较方便,就剩下 1024、4096、16384。其中选择 4096,第二个字节只需要拆分一半,即 3个字节生成 2个字符,这种情况下算法比较简单。当然选择 16384 的话会有更好的压缩率。

其中当编码到最后只剩下 1个或 2个字节时,无法继续编码,则把剩下的字节不再位移直接映射到字符上。类似于 base64,CJKEncoding 会在剩下 1个字节时会在最后补 2个’=’,在剩下 2个字节时补 1个’=’。

编码结果示例(byte[25],char[18]):埯哉呆圔喢哦唫倮妣嚪亰噮唲壘巶丷==

解码结果(base64)(char[36]):nvbJZGkUeibmcrIuujiqCwhucyrY/2/2Nw==

三、后记

如上述编码示例所示,CJKEncoding 能压缩一倍 base64 编码的长度,即压缩率为 66.7%。

然而这并没有什么意义。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注