Groovy中UTF-8字节转字符串出现乱码问题求助
问题解决:Groovy中UTF-8字节数组转字符串后乱码的修复
问题核心
希腊字符序列ΜΎΚΟΝΟΣ处理后变为ΜΎΚΟ?ΟΣ,对应UTF-8字节0xce 0x9d(对应字符Ν)转字符串再转回字节时,被替换为0xce 0x3f(问号的UTF-8编码)。根源是未显式指定字符集,导致使用平台默认字符集转码,而默认字符集不支持该希腊字符,转码时丢失信息。
修复方案
转字符串和转回字节数组时,必须显式指定UTF-8字符集,避免依赖平台默认值:
- 字节转字符串:
new String(bytes, StandardCharsets.UTF_8) - 字符串转字节:
.getBytes(StandardCharsets.UTF_8)
修正后的代码
import java.nio.charset.StandardCharsets; def myUTF8String = "ce9cce8ece9ace9fce9dce9fcea3" def bytes = myUTF8String.decodeHex(); // 全程显式使用UTF-8字符集进行转换 content = new String(bytes, StandardCharsets.UTF_8).getBytes(StandardCharsets.UTF_8) for (i = 0; i < content.length; i++) { if (bytes[i] != content[i]) { println "Different... at pos " + i def hexBytes = Long.toUnsignedString(bytes[i], 16).toUpperCase().padLeft(2, '0') def hexContent = Long.toUnsignedString(content[i], 16).toUpperCase().padLeft(2, '0') println "${hexBytes} != ${hexContent}" } }
说明
运行修正后的代码不会输出任何差异,字节序列完全匹配,字符也能正确显示为ΜΎΚΟΝΟΣ。显式指定字符集是跨平台处理多语言字符的标准做法,可避免因运行环境不同导致的编码问题。
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

