直接调用String.getBytes(StandardCharsets.UTF_8)可可靠实现UTF-8编码,避免无参getBytes()因平台默认编码(如Windows的GBK)导致跨系统乱码;需配套UTF-8解码,并在HTTP、文件I/O等场景显式指定编码。

直接调用 String.getBytes("UTF-8") 或 String.getBytes(StandardCharsets.UTF_8) 即可手动指定 UTF-8 编码,这是解决跨系统乱码最可靠的方式。关键在于**避免使用无参的 getBytes()**,因为它依赖平台默认编码(如 Windows 是 GBK,Linux/macOS 通常是 UTF-8),极易导致不一致。
优先使用 StandardCharsets.UTF_8(推荐)
Java 7+ 提供了标准字符集常量,类型安全、无需异常处理、性能更好:
-
✅ 正确写法(无异常、清晰、高效):
byte[] bytes = str.getBytes(StandardCharsets.UTF_8); -
❌ 避免写法(需 try-catch,且字符串字面量易拼错):
byte[] bytes = str.getBytes("UTF-8"); // 可能抛 UnsupportedEncodingException
序列化/网络传输时务必配套指定解码方式
仅编码端用 UTF-8 不够,接收方也必须用 UTF-8 解码,否则前功尽弃:
- 发送方:
byte[] data = message.getBytes(StandardCharsets.UTF_8); - 接收方:
String received = new String(data, StandardCharsets.UTF_8); - HTTP 场景:确保
Content-Type包含; charset=utf-8(如text/plain; charset=utf-8)
文件读写也要显式声明编码
用 FileOutputStream 写入时,getBytes 指定 UTF-8;读取时用 InputStreamReader 显式传入 UTF-8:
- 写文件:
fos.write(str.getBytes(StandardCharsets.UTF_8)); - 读文件:
new InputStreamReader(fis, StandardCharsets.UTF_8) - 更推荐用
Files.write(..., StandardCharsets.UTF_8)和Files.readAllLines(..., UTF_8)
注意控制台输出的“假乱码”干扰
终端或 IDE 控制台本身编码设置不当,可能让正确编码的字符串显示为乱码,但这不是程序问题:
- IntelliJ:Settings → Editor → File Encodings → 全局编码设为 UTF-8
- Windows CMD:执行
chcp 65001切换到 UTF-8 模式 - 验证是否真乱码:把字节数组打印为十六进制(如
Arrays.toString(bytes)),比对 UTF-8 编码表











