Kotlin中Gzip压缩字符串输出乱码,如何生成Base64格式结果?
Gzip压缩字符串并转为Base64格式(Kotlin)
问题场景
我用这段Kotlin代码压缩字符串:
val bos = ByteArrayOutputStream() GZIPOutputStream(bos).bufferedWriter(Charsets.UTF_8).use { it.write(data) } String(bos.toByteArray(),Charsets.UTF_8)
输入字符串为<?xml version="1.0" encoding="UTF-8" standalone="no"?><VAST version="2.0">时,输出是乱码,我需要得到Base64格式的压缩结果,比如:H4sIAAAAAAAAA7Oxr8jNUShLLSrOzM+zVTLUM1BSSM1Lzk/JzEu3VQoNcdO1UFIoLknMS0nMyc9LtVXKy1eyt7MJcwwOQegyAuqyAwB+wzaKSgAAAA==
解决方案
你的问题出在直接将GZIP压缩后的二进制字节数组转为UTF-8字符串——GZIP输出的是二进制数据,并非合法的UTF-8字符序列,所以会出现乱码。正确的做法是对压缩后的字节数组进行Base64编码,得到可识别的文本格式。
修正后的Kotlin代码
import java.io.ByteArrayOutputStream import java.util.Base64 import java.util.zip.GZIPOutputStream fun compressToBase64(data: String): String { val bos = ByteArrayOutputStream() GZIPOutputStream(bos).use { gzipOut -> gzipOut.write(data.toByteArray(Charsets.UTF_8)) } return Base64.getEncoder().encodeToString(bos.toByteArray()) } // 使用示例 val input = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><VAST version=\"2.0\">" val base64Compressed = compressToBase64(input) println(base64Compressed) // 输出目标Base64字符串
代码说明
- 直接将输入字符串转为UTF-8字节数组,写入
GZIPOutputStream(无需通过bufferedWriter,避免额外字符编码层的干扰) - 完成压缩后,获取二进制压缩结果
- 用Base64编码器将二进制数据转为标准Base64字符串,得到可识别的文本格式
内容的提问来源于stack exchange,提问作者amodkanthe
相关产品推荐
相关产品推荐

