假设我有一个ruby Hash,它有一个非常大的字符串。它是如此之大,以至于压缩字符串可能是有意义的。使用ActiveSupport::Gzip.compress
压缩字符串是微不足道的,但由于编码,将该哈希转换为JSON被证明是一个问题。
基本上,这段代码失败了:{ compressed: ActiveSupport::Gzip.compress('asdf') }.to_json
个
出现以下错误:JSON::GeneratorError: Invalid Unicode [8b 08 00 56 dd] at 1
个
当使用to_json
转换为json时,不包含任何压缩数据的散列会被编码为UTF-8,但调用ActiveSupport::Gzip.compress('asdf').encode('UTF-8')
会失败,并出现以下错误:Encoding::UndefinedConversionError: "\x8B" from ASCII-8BIT to UTF-8
个
我这是在做傻事吗?我的目标能实现吗?
1条答案
按热度按时间cuxqih211#
Base-64 encode gzip输出,使其成为可读字符,因此是有效的UTF-8。这将使数据扩展约三分之一以上,抵消一些压缩。您也可以使用更有效的字符编码,例如Base-85,以减少影响,在这种情况下扩展约四分之一以上。经过一些工作,您应该能够将其降低到接近1/7的增加。
下面是一个用C语言编写的示例代码,它将字节编码为1..127中的符号,这些符号都是有效的UTF-8。(JSON不允许字符串中有空字节。)由此产生的扩展约为1.145。
字符串