java处理乱码的核心是编码与解码规则统一——字符串在jvm内恒用utf-16,外部交互必须显式指定charset(如utf-8),避免依赖系统默认值;文件、网络、数据库等各环节需全程统一编码,且读写配对(如gbk读就gbk解,utf-8写就utf-8编)。

Java 中处理乱码,核心是让“编码”和“解码”两端用同一套规则。乱码不是字符坏了,而是字节被按错误的方式重新解读了。只要理清数据从哪来、经过哪、到哪去,再统一各环节的编码(推荐全程 UTF-8),问题就解决大半。
明确源头编码,再转成目标编码
最常见场景:你拿到一串字节(比如从文件、网络或数据库读出),但不知道它原本是用什么编码存的,结果 new String(bytes) 出来是乱码。这时不能瞎猜,得先确认原始编码,再转换:
- 若确定源是 GBK(如旧系统导出的文本),用 new String(bytes, "GBK") 构造字符串;后续要存为 UTF-8 文件,再调用 str.getBytes("UTF-8")
- 若源编码不确定,可用工具类(如 jchardet)探测,或根据文件头、上下文判断(例如 Windows 记事本保存的 ANSI 文件多为 GBK)
- 避免直接用 new String(bytes) —— 它依赖 JVM 默认编码,跨环境极易出错
IO 流读写时显式指定编码
文件或网络流本身不带编码信息,Java 不会自动识别。必须在构建 Reader/Writer 时传入 Charset:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 读文件:new InputStreamReader(new FileInputStream("a.txt"), "UTF-8")
- 写文件:new OutputStreamWriter(new FileOutputStream("b.txt"), "GBK")
- 用 Files 工具类更简洁:Files.readString(path, StandardCharsets.UTF_8) 或 Files.write(path, lines, StandardCharsets.GB18030)
Web 请求与响应中的编码控制
浏览器和服务器之间默认可能用 ISO-8859-1 传输中文,导致 POST 提交或 URL 参数乱码:
- POST 请求:在 Servlet 开头加 request.setCharacterEncoding("UTF-8"),确保 getParameter() 返回正确字符串
- GET 请求:URL 参数已由容器按 ISO-8859-1 解码,需手动反转:new String(param.getBytes("ISO-8859-1"), "UTF-8")
- 响应输出:设置 response.setContentType("text/html; charset=UTF-8"),并调用 response.setCharacterEncoding("UTF-8")
数据库连接与字段编码一致性
乱码常发生在“Java → JDBC → 数据库”链路中某环编码不匹配:
- 建表时指定字符集:CREATE TABLE t (...) DEFAULT CHARSET = utf8mb4
- JDBC 连接 URL 加参数:?characterEncoding=utf8&useUnicode=true
- 避免用 Statement.execute("INSERT INTO t VALUES ('中文')"),改用 PreparedStatement,它能自动处理编码转换
- 检查 MySQL 的 client、connection、results 字符集是否均为 utf8mb4(用 SHOW VARIABLES LIKE 'character_set%' 查)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










