将UTF-8(或其他8位编码)压缩至7位或更少

2 投票
6 回答
3228 浏览
提问于 2025-04-15 16:38

我想把一个用UTF-8编码的文件转换成7位编码,这个文件里最多只用到128个不同的字符。这样做是为了节省空间,因为7位编码比8位编码少了1/8的空间。比如说,如果我有一个16MB的文本文件,只用了前128个(ASCII)字符,我希望能把多余的那部分去掉,把文件大小减到14MB。

我该怎么做呢?

目前似乎没有现成的免费或收费的软件可以做到这一点,所以我在想,或许我可以尝试自己做一个简单的(虽然效率可能不高)程序。

我的基本想法是,先把当前每个字符的十六进制/十进制/二进制值转换成7位编码下的128个值,然后扫描整个文件,把每个修改后的值写入一个新文件。

举个例子,如果文件的内容是(我用十进制的例子,因为我不想考虑十六进制)

127 254 025 212 015 015 132...

那么它会变成

001 002 003 004 005 005 006

假设127映射到001,254映射到005,等等。

不过我对几个问题不是很确定。

  1. 这样做真的能缩小文件大小吗?我有种不好的预感,这样可能只是把二进制字符串多了一个0,比如11011001可能会被映射成01000001,而不是1000001,那样我就没法节省空间了。如果真是这样,我该怎么去掉那个多余的0呢?
  2. 我该怎么打开文件以便以二进制/十进制/十六进制的方式读写,而不是仅仅以文本的方式?我主要用Python,但如果需要的话,我也能勉强用C语言。

谢谢。

6 个回答

3

你的想法是对的,但还需要进一步完善。如果你对这种数据压缩感兴趣,可以去了解一下霍夫曼编码。这是一种简单的数据压缩方法,在很多实际应用中都能见到。

我推荐你看看马克·尼尔森的《数据压缩书》,这是一本很好的数据压缩技术入门书籍。

6

你知道文件是由字节组成的吗?所以,如果你这样做的话,第一字母的7位会在第一个字节里,接着第二字母的1位也在这个字节里。然后在第二个字节里,你会有第二字母的6位和第三字母的2位,依此类推。它的排列会像这样:

|AAAAAAAB|BBBBBBCC|CCCCCDDD|DDDDEEEE|EEEFFFFF|FF...
 \------/ \------/ \------/ \------/ \------/
   byte     byte     byte     byte     byte
18

只需要使用gzip压缩,就能轻松节省60%到70%的空间,几乎不需要任何努力!

撰写回答