当前位置 博文首页 > Java_BlackHumour的博客:【日常积累】web乱码一锅炖

    Java_BlackHumour的博客:【日常积累】web乱码一锅炖

    作者:[db:作者] 时间:2021-07-10 22:31

    乱码常见场景:页面显示乱码,表单提交乱码,数据库存储乱码等。

    乱码原因:编码-解码过程中码表不一致产生的。

    字符编码:页面默认编码为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.csdn.net/u010246789/article/details/52669998
    ? ? ? ? ? ?https://blog.csdn.net/GreetTuring/article/details/55682565
    ? ? ? ? ? ?https://www.cnblogs.com/cst11021/p/4964007.html

    cs