java 18起默认utf-8编码,统一跨平台字符处理,消除因系统locale差异导致的乱码问题,所有未显式指定编码的i/o操作均默认使用utf-8。

Java 中字符编码优化是多语言国际化支持的底层基础,不是加个 Locale 就能自动生效,关键在于全链路编码统一 + 显式控制 + 场景适配。
统一项目默认编码为 UTF-8
UTF-8 是唯一能稳定覆盖中、日、韩、阿拉伯、西里尔等全部主流文字的编码。必须在多个层面强制设定,避免依赖系统默认值:
- Maven 构建:在 pom.xml 中声明源码和报告编码
- IDE 设置:IntelliJ 或 Eclipse 的项目编码、文件模板、新建文件默认编码全部设为 UTF-8
- JVM 启动参数:添加 -Dfile.encoding=UTF-8,覆盖操作系统默认(如 Windows 的 GBK)
- Java 源文件头部无需声明编码,但需确保保存时确实是 UTF-8(无 BOM)
文件读写必须显式指定字符集
Java 的 String.getBytes() 和 new String(byte[]) 若不传 Charset,会调用平台默认编码,极易出错。所有 I/O 操作都应显式传参:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 读文本文件:用 Files.readAllLines(path, StandardCharsets.UTF_8)
- 写 CSV/Excel:Apache POI、Fesod 等库均提供 .charset(StandardCharsets.UTF_8) 链式调用
- 网络请求体:HttpClient 发送 JSON 时,setContentType("application/json; charset=utf-8")
- 避免使用 new InputStreamReader(new FileInputStream(...)) 这类无参构造器
Web 层编码要覆盖请求与响应两端
Tomcat 或 Spring Boot 应用中,中文乱码最常发生在表单提交和页面输出环节:
- 请求端:对 POST 请求体设置 request.setCharacterEncoding("UTF-8")(Spring Boot 可通过 server.servlet.encoding.charset=UTF-8 全局配置)
- 响应端:设置 response.setContentType("text/html;charset=UTF-8"),并确保 HTML 中有
- URL 路径或参数含中文时,需启用 Tomcat 的 URIEncoding="UTF-8"(在 server.xml 的 Connector 中配置)
数据库连接与字段定义同步 UTF-8
即使 Java 端全 UTF-8,数据库若用 latin1 或未设 utf8mb4,照样存坏中文:
- MySQL 字符集:表与字段均设为 utf8mb4(不是旧版 utf8),排序规则推荐 utf8mb4_unicode_ci
- JDBC 连接串必须带参数:?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
- JPA/Hibernate 配置中添加 hibernate.connection.characterEncoding=UTF-8
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










