关键不是“转换”,而是让每一步都用UTF-8显式约定,避免隐式依赖平台默认编码;中文变问号本质是字节被错误解码,如UTF-8字节被当ISO-8859-1或GBK处理而替换为?。

关键不是“转换”,而是让每一步都用 UTF-8 显式约定,避免隐式依赖平台默认编码。中文变问号,本质是字节被错误解码——比如本该按 UTF-8 解的字节,却被当成 ISO-8859-1 或 GBK 处理,结果无法映射,就替换成 ?。
Java 源文件与编译环境统一为 UTF-8
IDE 编码设置不匹配会导致源码里的中文在编译时就被读错:
- IntelliJ IDEA:Settings → Editor → File Encodings → 将 Global Encoding、Project Encoding、Default encoding for properties files 全部设为 UTF-8
- Maven 项目:在 pom.xml 中声明
<project.build.sourceencoding>UTF-8</project.build.sourceencoding> - 命令行编译:使用
javac -encoding UTF-8,避免 javac 默认用系统编码(Windows 常为 GBK)
运行时强制 JVM 使用 UTF-8
JVM 启动时不指定编码,会继承操作系统默认值(Windows 是 GBK),导致 System.out.println 输出中文变成问号:
- IDE 运行配置中,在 VM options 添加:
-Dfile.encoding=UTF-8 - Tomcat:在 catalina.sh 或 catalina.bat 中添加
export JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8" - Spring Boot:启动脚本或 application.properties 中加
spring.http.encoding.charset=UTF-8(仅对 Web 层有效,底层仍需 JVM 级设置)
HTTP 请求/响应明确指定编码
前后端交互中,中文乱码多发生在 request.getParameter() 或 response.getWriter() 阶段:
立即学习“Java免费学习笔记(深入)”;
- 接收请求前必须调用:
request.setCharacterEncoding("UTF-8")(仅对 POST 表单有效;GET 参数需改 Tomcat 的 server.xml,在 Connector 中加URIEncoding="UTF-8") - 响应输出前设置:
response.setContentType("text/html; charset=UTF-8")和response.setCharacterEncoding("UTF-8") - 避免手动 new String(bytes, "UTF-8") 套娃转换——只要 request 和 response 编码已设好,直接用
request.getParameter("name")即可
数据库连接与表结构全程 UTF-8
存进数据库是问号,说明数据在写入环节已被损坏,修复源头比后期转码更可靠:
- 建表时显式指定字符集:
CREATE TABLE t (c VARCHAR(100)) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - JDBC URL 加参数:
?useUnicode=true&characterEncoding=utf8mb4&serverTimezone=Asia/Shanghai - MySQL 服务端确认:
SHOW VARIABLES LIKE 'character_set%';,确保character_set_client、character_set_connection、character_set_database全为utf8mb4


















