乱码常见场景:页面显示乱码,表单提交乱码,数据库存储乱码等。
乱码原因:编码-解码过程中码表不一致产生的。
字符编码:页面默认编码为ISO-8859-1,简体中文编码为GB2312(2个字节),中文汉字集(简体与繁体)编码为GBK(2个字节),国际编码为UTF-8(3个字节)。
显示乱码:
HTML中<head>标签下:<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
JSP中顶部添加:<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<head>标签下添加:<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
IDE中设置jsp页面编码utf-8:以eclipse为例,window > Prefrences > Web > JSP Files > Encoding处改成支持UTF-8格式的选项。
传输乱码:
tomcat中 servlet.xml 中配置:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>
request请求:
浏览器使用什么码表打开当前页面, 就使用什么码表来发送请求参数.
get请求Java代码手动编解码:username= new String(username.getBytes("ISO-8859-1"),"UTF-8");
post请求:request.setCharacterEncoding("utf-8");
response响应:
response.setCharacterEncoding("utf-8"); //通知服务器使用utf-8来发送响应实体中数据
response.getOutputStream().write("中国".getBytes("utf-8"));// 指定编码为utf-8 -- 只对本行有效
response.setContentType("text/html;charset=utf-8");//指定浏览器在接收数据时也使用同一个编码来打开数据
response.setHeader("Content-Type", "text/html;charset=utf-8");//与上面等价
Filter 过滤器:
Spring为例
<!--中文乱码解决方案-->
<filter>
<filter-name>characterEncodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
数据库连接:
MySQL: url="jdbc:mysql://localhost:3306/Laptop?useUnicode=true&characterEncoding=utf-8"
MySQL修改默认客户端连接字符集:修改配置文件my.ini编码 default-character-set=utf-8。
插入数据库
建库;CREATE DATABASE mydb3 CHARACTER SET utf8 COLLATE utf8_bin;
建表:CREATE TABLE `books` (
......
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
参考:https://blog.youkuaiyun.com/u010246789/article/details/52669998
https://blog.youkuaiyun.com/GreetTuring/article/details/55682565
https://www.cnblogs.com/cst11021/p/4964007.html