乱码问题原因
乱码问题的本质是编码和解码使用不同的字符集。
编码解码原理
Java
发送端:字符串 → 字节(编码)
接收端:字节 → 字符串(解码)
乱码产生原因:
- 编码和解码使用不同字符集
- 编码格式未正确指定
- 多次编码/解码
请求乱码
POST请求乱码
原因:请求体未指定编码,Tomcat默认使用ISO-8859-1解析
XML
// 解决方案:设置请求编码
request.setCharacterEncoding("UTF-8");
或配置CharacterEncodingFilter:
XML
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
GET请求乱码
原因:URL参数在Tomcat connector解析时使用错误编码
Java
<!-- Tomcat server.xml配置 -->
<Connector URIEncoding="UTF-8" ... />
或手动转换:
Java
String name = request.getParameter("name");
String correctName = new String(name.getBytes("ISO-8859-1"), "UTF-8");
响应乱码
原因:响应未指定编码,浏览器使用默认编码解析
properties
// 设置响应编码
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
数据库乱码
原因:数据库连接或表编码不一致
text
jdbc.url=jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=UTF-8
编码对比
| 编码 | 字符范围 | 特点 |
|---|---|---|
| ISO-8859-1 | 单字节西欧字符 | Tomcat默认编码 |
| GBK | 中文字符 | 双字节,中文专用 |
| UTF-8 | 全球字符 | 可变字节,国际化 |
常见乱码场景
| 场景 | 原因 | 解决方案 |
|---|---|---|
| POST表单乱码 | 请求体编码错误 | CharacterEncodingFilter |
| GET参数乱码 | URL编码错误 | Tomcat URIEncoding配置 |
| 响应页面乱码 | 响应编码错误 | setContentType设置编码 |
| 数据库乱码 | 连接编码错误 | JDBC URL指定编码 |
统一使用UTF-8编码,从数据库、服务器到前端保持一致。
要点总结
- 乱码本质:编码和解码字符集不一致
- POST乱码:请求体编码错误,使用过滤器解决
- GET乱码:URL解析编码错误,配置Tomcat URIEncoding
- 响应乱码:设置contentType包含charset
📝 发现内容有误?点击此处直接编辑