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

Java向ByteArrayOutputStream写入字符串时ü等特殊字符变为?的问题

问题根因

该问题由代码逻辑疏漏和调试工具字符集匹配错误共同导致,具体如下:

  • 代码变量逻辑矛盾:你定义了存储Zürich的变量为text,但实际写入ByteArrayOutputStream时调用的是jsonResponse.getBytes(),如果jsonResponse不是你预期的对应字符串,首先就会出现内容不符的问题。
  • 调试工具解码错误是最核心的原因:你查看ByteArrayOutputStream存储内容的调试工具,默认用了*不支持Unicode的单字节字符集(比如ISO-8859-1、GBK)*解析UTF-8编码的字节数组:字符ü的UTF-8编码为双字节0xC3 0xBC,单字节字符集无法正常识别该编码,会直接替换为?展示,和你观测到的Z?rich现象完全匹配。
  • 额外风险点:你的代码中两次调用jsonResponse.getBytes(StandardCharsets.UTF_8),会生成两个独立的字节数组,若两次调用中间jsonResponse被修改,会导致写入的偏移量、长度和实际要写入的字节数组不匹配,也可能引发截断、乱码问题,建议优化写法:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
String text = "Zürich";
// 先统一获取字节数组再写入,避免重复调用getBytes产生差异
byte[] contentBytes = text.getBytes(StandardCharsets.UTF_8);
baos.write(contentBytes, 0, contentBytes.length);

你可以通过以下方式验证存储内容实际是正确的:

// 转字符串时明确指定UTF-8编码即可拿到正确结果
String result = baos.toString(StandardCharsets.UTF_8);
// 此时result的值为正常的Zürich

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 11:06:00