在 Java 中,String 本身不会乱码,乱码通常出现在 字节 ↔ 字符转换 的过程中。只要编码和解码使用一致的字符集,就可以避免乱码。
下面从原理到实践系统说明。
String 内部始终使用 UTF-16
乱码发生在:
- byte[] → String(解码)
- String → byte[](编码)
✅ 关键:编码和解码使用相同的 charset
❌ 错误(使用平台默认编码)
byte[] bytes = ...;
String s = new String(bytes); // 可能乱码
✅ 正确(明确指定编码)
String s = new String(bytes, StandardCharsets.UTF_8);
❌ 错误
byte[] bytes = s.getBytes(); // 平台相关
✅ 正确
byte[] bytes = s.getBytes(StandardCharsets.UTF_8);
try (BufferedReader br = new BufferedReader(
new InputStreamReader(
new FileInputStream("a.txt"),
StandardCharsets.UTF_8))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
try (BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream("a.txt"),
StandardCharsets.UTF_8))) {
bw.write("中文");
}
✅ 推荐直接用:
Files.readString(Path.of("a.txt"), StandardCharsets.UTF_8);
Files.writeString(Path.of("a.txt"), "中文", StandardCharsets.UTF_8);
示例(HTTP):
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
✅ 连接 URL 指定编码:
jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=UTF-8
✅ 数据库、表、字段统一为 utf8mb4
✅ 永远不要依赖默认编码
| 场景 | 推荐 |
|---|---|
| 字符串 ↔ 字节 | StandardCharsets.UTF_8 |
| 文件 | Files / Reader / Writer |
| Web | UTF-8 |
| 数据库 | UTF-8 / utf8mb4 |
System.out.println(Charset.defaultCharset());
⚠️ 不同操作系统结果不同(Windows 常是 GBK)
String 不乱码的关键:
在 byte ↔ char 转换时,始终明确指定 UTF-8,不依赖系统默认编码。
如果你有具体场景(文件 / 接口 / 控制台 / 数据库),我可以给你针对性代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。