LZW压缩与整个unicode库

时间:2013-02-10 19:46:56

标签: c compression lzw

我正在尝试解决这个问题:

  

假设我们有一个整个Unicode字符集的初始字母表,   而不是只是所有可能的字节值。回想一下unicode   字符是无符号的2字节值,因此这意味着每个字符   2个字节的未压缩数据将被视为一个符号,并且   我们将有一个超过60,000个符号的字母表。 (将符号视为   2字节的Unicodes,而不是一次一个字节,可以做得更好   在国际化文本的情况下压缩。)并且,请注意,有   没有任何限制每个代码的位数最多16个。就像你一样   对于这个非常大的字母表推广LZW算法,不用担心   如果你有一些非常长的代码。

     

有了这个,给出这个四符号序列的压缩版本,   使用我们的项目假设,包括EOD代码和分组   变成4字节的整数。 (这三个符号是Unicode值,   用数字表示。)将你的答案写成3个8位十六进制值,   空格分隔,使用大写十六进制数字,而不是小写。

     

32767 32768 32767 32768

我遇到的问题是我不知道字母表的整个范围,所以在进行LZW压缩时我不知道新代码会有什么字节值。出于这个问题,我也不知道EOD代码会是什么。

另外,在我看来,它只需要两个整数的压缩数据。

1 个答案:

答案 0 :(得分:1)

问题陈述不正确。

在Unicode中,正如我们今天所知,代码点(代表字符的数字,字符的可组合部分以及其他有用但更偷偷摸摸的东西)不能全部编号为0到65535以适合16位。 Unicode中有超过10万个中文,日文和韩文字符。显然,你只需要17位以上。因此,Unicode显然不是正确的选择。

OTOH,存在一种“精简版”的Unicode Universal Character Set,其 UCS-2 编码使用16位代码点,技术上最多可用于65536人物等。代码大于65535的那些字符很不幸,你不能使用UCS-2。

所以,如果它真的是UCS-2,你可以下载它的规范(ISO / IEC 10646,我相信)并确切地弄清楚那些64K中的哪些代码被使用,因此应该形成你的初始LZW字母表。