Java字符串编码异常:客户端与本地输出不一致求助
字符编码异常问题排查与解决
问题现象
我们有一段Java代码,在客户端机器运行时字符编码表现异常,本地无法复现。代码如下:
static private String bytesToHex(byte[] in) { final StringBuilder builder = new StringBuilder(); for(byte b : in) { builder.append(String.format("%02x", b)); } return builder.toString(); } static private String normalize(String str) { System.out.println("Normalize " + str + " / hex " + bytesToHex(str.getBytes(StandardCharsets.UTF_8))); // ... }
针对带变音符号的字符,客户端日志的十六进制输出存在错误:
- 本地输出(符合预期):
Normalize ë / hex c3ab - 客户端输出:
Normalize ë / hex c383c2ab
客户端输出中,"ë"的UTF-8字节c3ab被错误解析,最终字符串的UTF-8编码变成了c383c2ab——这是ë的UTF-8编码,推测是原字节被以ISO-8859-1编码解析导致。
问题原因与修复
后续排查确认是多层编码异常叠加导致:
- 字符串
str来自REST调用,代码中使用new InputStreamReader(conn.getInputStream())时,本地环境默认编码为UTF-8,但客户端机器默认编码是ISO-8859-1,导致读取响应流时把原本UTF-8编码的ë(字节c3ab)用ISO-8859-1解析成了ë(两个字符)。 - 客户端日志以ISO-8859-1编码写入,而我们查看日志时用UTF-8编码读取,导致日志里的
ë被显示成了ë,造成"字符串是ë但编码异常"的假象。
修复方案:在构造InputStreamReader时显式指定UTF-8编码,避免依赖系统默认编码:
new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8)
内容的提问来源于stack exchange,提问作者ExecutionSommaire
相关产品推荐
相关产品推荐

