You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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编码解析导致。

问题原因与修复

后续排查确认是多层编码异常叠加导致:

  1. 字符串str来自REST调用,代码中使用new InputStreamReader(conn.getInputStream())时,本地环境默认编码为UTF-8,但客户端机器默认编码是ISO-8859-1,导致读取响应流时把原本UTF-8编码的ë(字节c3ab)用ISO-8859-1解析成了ë(两个字符)。
  2. 客户端日志以ISO-8859-1编码写入,而我们查看日志时用UTF-8编码读取,导致日志里的ë被显示成了ë,造成"字符串是ë但编码异常"的假象。

修复方案:在构造InputStreamReader时显式指定UTF-8编码,避免依赖系统默认编码:

new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8)

内容的提问来源于stack exchange,提问作者ExecutionSommaire

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 16:30:01