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
相关产品推荐
相关产品推荐

