Ruby中使用zlib的Deflate方法生成无效乱码字符问题求解
问题原因
Zlib::Deflate.deflate方法返回的是二进制压缩数据流,本身就不属于人类可读的文本格式,直接打印或者当作普通文本输出时,就会显示为乱码,这不是压缩逻辑出错,是输出/使用方式不符合二进制数据的处理要求。
解决方案
分两种常用场景适配:
场景1:接口直接返回压缩数据给客户端
需要给Sinatra响应添加正确的HTTP头,告知客户端返回内容是deflate压缩的二进制流,避免客户端按普通文本解析:
require 'sinatra' require 'zlib' get '/v1/generate' do file_content = "teste" data_compressed = generate_diagram_from file_content # 配置响应头 headers \ "Content-Encoding" => "deflate", "Content-Type" => "application/octet-stream", "Content-Length" => data_compressed.bytesize.to_s data_compressed end def generate_diagram_from file_content Zlib::Deflate.deflate(file_content) end
场景2:需要将压缩结果保存为可读文本
可以将二进制压缩结果转码为Base64格式,就能得到无乱码的可读字符串,使用时先解码Base64再解压即可还原原内容:
require 'base64' def generate_diagram_from file_content compressed = Zlib::Deflate.deflate(file_content) Base64.encode64(compressed) end
验证压缩逻辑正确性的方法
你可以通过以下代码验证压缩结果是正常的,解压后可以完全还原原始内容:
original_str = "teste" compressed = Zlib::Deflate.deflate(original_str) decompressed = Zlib::Inflate.inflate(compressed) puts decompressed == original_str # 输出为true,说明压缩逻辑无问题
内容的提问来源于stack exchange,提问作者Marcos Vinícius
相关产品推荐
相关产品推荐

