Java中旧编码转UTF-8需先按原编码解码为字符串再UTF-8编码,关键在准确识别源编码(如GBK、GB2312、ISO-8859-1或Big5);若字符串已乱码,须先用错误编码转回字节再用正确编码解码。

Java 中将旧编码(如 GBK、GB2312、ISO-8859-1)的字节数组或字符串转为 UTF-8 编码的中文,核心是“先按原编码解码为字符串,再按 UTF-8 编码为字节数组”——关键在明确原始编码,否则会乱码。
确认原始编码再转换
乱码往往不是转换失败,而是猜错了源编码。常见中文旧编码有:
- GBK / GB2312:Windows 简体中文系统常用(如记事本默认保存)
- ISO-8859-1:某些 HTTP 参数、表单提交未设 charset 时可能误用
- Big5:繁体中文环境(如台湾)
若不确定,可尝试用 new String(bytes, "GBK") 看是否显示正常中文;若全是问号或方块,换其他编码试。
字节数组 → UTF-8 字节数组(推荐场景)
适用于读取文件、网络响应等原始字节流:
立即学习“Java免费学习笔记(深入)”;
byte[] oldBytes = ...; // 比如从文件或 socket 读到的 GBK 字节
String str = new String(oldBytes, "GBK"); // 用原编码解码成字符串
byte[] utf8Bytes = str.getBytes("UTF-8"); // 再用 UTF-8 编码成新字节
⚠️ 注意:new String(bytes, charset) 和 str.getBytes(charset) 必须指定编码名,避免依赖平台默认编码(如 Windows 是 GBK,Linux/macOS 是 UTF-8)。
字符串 → UTF-8 字节数组(已含中文但编码混乱)
如果已有字符串但内容已乱码(例如把 GBK 字节错当 UTF-8 解码了),不能直接转——必须“回退”到原始字节再重解码:
- 错误做法:
badStr.getBytes("UTF-8")→ 得到的是乱码的 UTF-8 字节,无法恢复 - 正确做法:先用错误编码反向“编码”回字节,再用正确编码解码
例如:GBK 字节被当成 UTF-8 解成了乱码字符串 badStr:
byte[] misEncoded = badStr.getBytes("UTF-8"); // 把乱码字符串“还原”为当初的 GBK 字节
String correctStr = new String(misEncoded, "GBK"); // 再用 GBK 正确解码
文件读写时直接指定编码(最稳妥)
避免手动转换字节,用 NIO 或带编码的 Reader/Writer:
// 读 GBK 文件 → 转 UTF-8 字符串
Path path = Paths.get("data.txt");
List<String> lines = Files.readAllLines(path, Charset.forName("GBK"));
// 写为 UTF-8 文件
Files.write(Paths.get("out_utf8.txt"), lines, StandardCharsets.UTF_8);
使用 StandardCharsets.UTF_8、Charset.forName("GBK") 比字符串字面量更安全(编译期检查编码名)。


















