应显式指定 UTF-8 编码:优先用 toString(StandardCharsets.UTF_8)(JDK 7+,类型安全无异常),次选用 toString("UTF-8")(需处理 UnsupportedEncodingException);禁用无参 toString(),因其依赖平台默认编码(如 Windows 的 GBK),易致跨环境中文乱码。

Java 中 ByteArrayOutputStream.toString() 默认使用平台默认编码,不指定 UTF-8。要以 UTF-8 编码转字符串,必须显式传入字符集名称或 Charset 对象。
使用 toString(String charsetName) 方法
这是最常用的方式,直接传入字符集名称字符串:
-
toString("UTF-8")—— 传入字符串字面量,注意大小写(推荐用"UTF-8",不是"utf8"或"utf-8") - 该方法在 JDK 1.1+ 就已支持,兼容性好
- 若字符集名不合法(如拼错),会抛出
UnsupportedEncodingException
使用 toString(Charset charset) 方法(JDK 1.7+)
更类型安全、推荐的方式,避免拼写错误:
-
toString(StandardCharsets.UTF_8)—— 使用java.nio.charset.StandardCharsets中的静态常量 - 无需异常处理,因为
StandardCharsets.UTF_8是编译期确定的有效 Charset - JDK 7 引入,现代项目建议优先使用
不要依赖无参 toString() 方法
无参版本 toString() 内部调用 new String(buf, 0, count),实际使用 String.decode(),其编码由 Charset.defaultCharset() 决定:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
- Windows 系统通常是
GBK,Linux/macOS 通常是UTF-8,行为不可控 - 跨环境运行时极易出现中文乱码,尤其涉及网络传输或文件存储时
- 即使本地测试正常,上线后也可能因服务器环境不同而失败
完整示例代码
推荐写法(JDK 7+):
ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write("你好".getBytes(StandardCharsets.UTF_8));
String s = baos.toString(StandardCharsets.UTF_8); // ✅ 正确
// 或
String s2 = baos.toString("UTF-8"); // ✅ 也可,但需捕获异常(可选)
如果必须用字符串参数且 JDK 版本较老,记得加异常处理:
try {
String s = baos.toString("UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}

















