Java 压缩unicode字符

Java 压缩unicode字符,java,unicode,compression,gzip,gzipoutputstream,Java,Unicode,Compression,Gzip,Gzipoutputstream,我在java程序中使用GZIPOutputStream压缩大字符串,最后将其存储在数据库中 我可以看到,在压缩英文文本时,我实现了1/4到1/10的压缩比(取决于字符串值)。比如说,我的原始英文文本是100kb,那么平均压缩文本大约是30kb 但是当我压缩unicode字符时,压缩的字符串实际上比原始字符串占用更多的字节。比如说,我原来的unicode字符串是100kb,然后压缩版本是200kb Unicode字符串示例:“嗨,这是,短信计数测试持续给你。嗨这是短" 有人能建议我如何实现unic

我在java程序中使用
GZIPOutputStream
压缩大字符串,最后将其存储在数据库中

我可以看到,在压缩英文文本时,我实现了1/4到1/10的压缩比(取决于字符串值)。比如说,我的原始英文文本是100kb,那么平均压缩文本大约是30kb

但是当我压缩unicode字符时,压缩的字符串实际上比原始字符串占用更多的字节。比如说,我原来的unicode字符串是100kb,然后压缩版本是200kb

Unicode字符串示例:
“嗨,这是,短信计数测试持续给你。嗨这是短"

有人能建议我如何实现unicode文本的压缩吗?为什么压缩版本实际上比原始版本大

我的Java压缩代码:

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            GZIPOutputStream zos = new GZIPOutputStream(baos);

            zos.write(text.getBytes("UTF-8"));
            zos.finish();
            zos.flush();

            byte[] udpBuffer = baos.toByteArray();

我真的不懂中文,但据我所知,TEGZIP压缩依赖于文本的重复序列,这些重复序列用“描述”来改变(这是一个非常高级的解释)。这意味着如果你在一个字符串的20个位置上有一个单词“library”,那么算法将存储单词“library”“在侧面,然后请注意,它应该出现在x、y、z位置。。。因此,原始字符串中可能没有太多冗余,因此无法保存太多。相反,你的开销比储蓄多

我不是一个真正的压缩专家,我不知道细节,但这是压缩的基本原理

附言
这个问题可能只是重复的:

Java的
GZIPOutputStream
使用压缩算法压缩数据。Deflate是和的组合:

问:使用哈夫曼编码或LZW的无专利变体等标准压缩算法有什么问题

答:SCSU消除了编码中的额外冗余(每个字节的序列相同),而不是内容中的冗余,从而弥合了基于8位的LZW和16位编码的Unicode文本之间的差距。SCSU的输出应发送至LZW,以便在需要时进行块压缩

为了使用一种流行的通用算法(如Huffman或Lempel-Ziv压缩的任何变体)获得相同的效果,必须将其重新定位为16位,因为字母表的大小较大而失去效果。对于哈夫曼的例子来说,计算出压缩文本需要多少额外的比特是相对容易的,因为字母表更大。LZW也存在类似的影响。有关一般文本压缩问题的详细讨论,请参阅Bell、Cleary和Witten的《文本压缩》(Prentice Hall 1990)


我可以在unicode网站上找到SCSU压缩,这可能对您很有用,但是我找不到一个可以轻松导入到项目中的.jar库,尽管您可以根据需要将它们打包成一个库。

实际上,问题不在于unicode文本。问题是,如果文本的长度小于100字节,压缩就不能像预期的那样工作(在我的例子中,“this”小于100字节)