中文乱码问题的确令人头疼,接收get/post表单参数,或者从数据库取中文数据,都有可能出现乱码。

因为各个环境下使用的字符编码不同,HTML2.0 - HTML4.01、jsp默认使用ISO-8859-1,mysql数据库默认使用latin,HTML5使用UTF-8,ISO 8859和latin两种字符编码都不支持中文,具体可以参见下表

字符编码 说明
ISO/IEC 8859 欧洲字符集,支持丹麦语、荷兰语、德语、意大利语、拉丁语、挪威语、葡萄牙语、西班牙语,瑞典语等,1987 年首次发布。

ASCII 编码只包含了基本的拉丁字母,没有包含欧洲很多国家所用到的一些扩展的拉丁字母,比如一些重音字母,带音标的字母等,ISO/IEC 8859 主要是在 ASCII 的基础上增加了这些衍生的拉丁字母。

Shift_Jis 日语字符集,包含了全角及半角拉丁字母、平假名、片假名、符号及日语汉字,1978 年首次发布。
Big5 繁体中文字符集,1984 年发布,通行于台湾、香港等地区,收录了 13053 个中文字、408个普通字符以及 33 个控制字符。
GB2312 简体中文字符集,1980 年发布,共收录了 6763 个汉字,其中一级汉字 3755 个,二级汉字 3008 个;同时收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的 682 个字符。
GBK 中文字符集,是在 GB2312 的基础上进行的扩展,1995 年发布。

GB2312 收录的汉字虽然覆盖了中国大陆 99.75% 的使用频率,满足了基本的输入输出要求,但是对于人名、古汉语等方面出现的罕用字(例如朱镕基的“镕”就没有被 GB2312 收录),GB2312 并不能处理,所以后来又对 GBK 进行了一次扩展,形成了一种新的字符集,就是 GBK。

GBK 共收录了 21886 个汉字和图形符号,包括 GB2312 中的全部汉字、非汉字符号,以及 BIG5 中的全部繁体字,还有一些生僻字。

GB18030 中文字符集,是对 GBK 和 GB2312 的又一次扩展,2000 年发布。

GB18030 共收录 70244 个汉字,支持中国国内少数民族的文字,以及日语韩语中的汉字。

UTF-8

Unicode字符集 称为统一码、万国码,世界通用。

UTF 是 Unicode Transformation Format 的缩写,意思是“Unicode转换格式”,后面的数字表明至少使用多少个比特位(Bit)来存储字符。

UTF-8是一种变长的编码方案,使用 1~6 个字节来存储;

UTF-16 UTF-16介于 UTF-8 和 UTF-32 之间,使用 2 个或者 4 个字节来存储,长度既固定又可变。
UTF-32 UTF-32是一种固定长度的编码方案,不管字符编号大小,始终使用 4 个字节来存储;

目前,最常用的中文编码类型是GBK和UTF-8,GBK是Windows默认的中文编码方案,而UTF-8将中文推向全世界。

针对中文乱码,解决方法就是:统一所有的字符编码为GBK/UTF-8

1.MYSQL数据库的存取乱码问题:

登录mysql设置字符集

让数据库支持中文编码的数据。其中UTF-8也可以改成gbk。

show variables like 'char%';set character_set_database='utf-8';
set character_set_server='utf-8';
status;

2.HTML网页乱码问题:


如果使用的是html5,则不用修改,默认即为utf-8

你问我怎么知道自己用的是html5?哈哈,第1行改成简单的<!DOCTYPE HEML>就行了

如果不是h5或者想用gbk,在html文件中添加修改第5行的charset为utf-8或gbk

Content-Type的charset表示服务器发送给客户端时的内容编码

 1 <!DOCTYPE HTML>
 2 <html>
 3   <head>
 4     <title>修改乱码</title>
 5     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 6   </head>
 7
 8   <body>
 9     <p>你好!</p>
10   </body>
11 </html>

3.JSP网页乱码问题

jsp的本质是一个servlet,由tomcat这种servlet容器解析,所以比普通的html多了一步

添加修改第一行的pageEncoding为UTF-8/GBK,表示修改jsp的输出方式

这里注意 UTF-8一定要大写 ,小写会出现一些莫名其妙的错误,原因至今是个谜…

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2
 3 <!DOCTYPE HTML>
 4 <html>
 5   <head>
 6     <title>C学习系统</title>
 7     <meta http-equiv="pragma" content="no-cache">
 8     <meta http-equiv="cache-control" content="no-cache">
 9     <meta http-equiv="expires" content="0">
10     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
11     <meta http-equiv="description" content="This is my page">
12   </head>
13
14   <body>
15     This is my JSP page. <br>
16   </body>
17 </html>

4.servlet请求/响应的乱码问题:

在用到servlet的地方添加以下代码

request.setCharacterEncoding("UTF-8");//设置请求编码
response.setCharacterEncoding("UTF-8");//设置响应编码

5.一劳永逸的方法——过滤器:

新建一个Java类,继承Filter,Filter位于javax.servlet包下

 1 package filter;
 2
 3 import java.io.IOException;
 4
 5
 6 import javax.servlet.Filter;
 7 import javax.servlet.FilterChain;
 8 import javax.servlet.FilterConfig;
 9 import javax.servlet.ServletException;
10 import javax.servlet.ServletRequest;
11 import javax.servlet.ServletResponse;
12 import javax.servlet.annotation.WebFilter;
13
14 @WebFilter("/*")
15 public class EncodingFilter implements Filter {
16
17     public void init(FilterConfig fConfig) throws ServletException {
18     }
19
20     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
21             throws IOException, ServletException {
22
23         //response.setContentType("text/html;charset=UTF-8");
24         request.setCharacterEncoding("UTF-8");
25         response.setCharacterEncoding("UTF-8");
26
27         chain.doFilter(request, response);
28     }
29
30     public void destroy() {
31     }
32
33 }

第14行使用了Servlet3.0的注解,配置过滤器的应用范围,/* 代表所有文件

如果你用浏览器作为客户端的话,加上第23行,和标题2效果相同

用不了或不想用注解,可以使用原始xml配置方法:

在你的项目web根目录下创建web.xml文件,添加修改第15-22行

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xmlns="http://xmlns.jcp.org/xml/ns/javaee"
 4     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
 5     id="WebApp_ID" version="3.1">
 6     <display-name>project_name</display-name>
 7     <welcome-file-list>
 8         <welcome-file>index.html</welcome-file>
 9         <welcome-file>index.htm</welcome-file>
10         <welcome-file>index.jsp</welcome-file>
11         <welcome-file>default.html</welcome-file>
12         <welcome-file>default.htm</welcome-file>
13         <welcome-file>default.jsp</welcome-file>
14     </welcome-file-list>
15     <filter>
16         <filter-name>EncodingFilter</filter-name>
17         <filter-class>filter.EncodingFilter</filter-class>
18     </filter>
19     <filter-mapping>
20         <filter-name>EncodingFilter</filter-name>
21         <url-pattern>/*</url-pattern>
22     </filter-mapping>
23 </web-app>

16和20行对应,表示你起的过滤器名字,17行表示对应的java类完整路径(酌情修改),21行表示应用范围

如果你的tomcat版本在7.0以下,在接收get请求的时候,要使用以下方法转码才能得到正确的中文内容

String value = new String(request.getParameter(param_name).getBytes("ISO-8859-1"),"UTF-8");

request.getParameter(String param_name):接收参数param_name的内容getBytes(String decode):表示根据指定的decode编码返回某字符串在该编码下的byte数组表示String(bytes[] bt,String encode):重新以encode格式编码,返回字符串

6.getParameter和getAttribute的区别:

getParameter(String param)专门用来接收表单等请求数据,返回的一定是字符串类型

getAttribute(String param)表示获取参数,返回的是Object类型,强制转换后可以恢复成各种实体类,往往和setAttribute(String param,Object obj)搭配使用

比如说:

session.setAttribute("userInfo",user);
User user=(User)session.getAttribute("userInfo");

User是一个bean实体类,第一行把它的实例化对象存入了session会话中,起名叫userInfo

第二行从session中获取到了userInfo,并强转恢复为User类型

session的作用范围是一次会话,通俗说就是你打开浏览器浏览那个网站,会话就开始;关闭或注销登录,一次会话就结束,session的内容会销毁

编码过滤器 | 解决中文乱码问题相关推荐

  1. java 中文乱码过滤器_JAVA中文乱码过滤器(用java过滤器解决中文乱码)V0422 整理版...

    JAVA中文乱码过滤器(用java过滤器解决中文乱码)V0422 整理版 不用再担心java中文乱码问题,一步到位,一次性解决.更方便更快捷. web-xml配置 EncodingFilter com ...

  2. java 过滤器 中文_java中Filter过滤器解决中文乱码办法

    java中Filter过滤器解决中文乱码办法 发布时间:2020-04-07 10:19:09 来源:亿速云 阅读:16 作者:小新 这篇文章主要为大家详细介绍了java中Filter过滤器解决中文乱 ...

  3. JavaWeb过滤器解决中文乱码问题

    文章目录 前言 一.创建过滤器的类 二.实现接口 1.EncodingFilter implements Filter 2.web.xml注册过滤器 3. 重新运行项目即可 前言 Javaweb三大组 ...

  4. FTP客户端如何判断FTP服务端的编码(解决中文乱码)

    参考FlashFTP做法: 首先发送命令:FEAT,获取服务端扩展属性 其返回响应: [右] FEAT [右] 211-Features: [右]  MDTM [右]  REST STREAM [右] ...

  5. java txt中文乱码,JAVA读取TXT文件 可解决中文乱码问题

    import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.I ...

  6. ResourceBundle 读取properties 配置文件 并解决中文乱码

    1.创建 sysconfig.propertiesPOWER_OUTPUT_FILE_PATH=F://能源院//数据文件//数据文件//2. GESP-电力规划软件//GESP_output.out ...

  7. ​ SpringMVC表单请求参数的绑定,配置编码过滤器解决请求参数中文乱码问题,自定义类型转换器

    文章目录 ​ SpringMVC的参数绑定支持的数据类型 基本数据类型和字符串类型 JavaBean 包装类 Map类型 List类型 POST请求参数中文乱码的解决方法 自定义类型转换器(Date类 ...

  8. SpringMVC 解决中文乱码的过滤器

    <!--配置解决中文乱码问题的过滤器--><filter><filter-name>characterEncodingFilter</filter-name& ...

  9. 配置解决中文乱码的过滤器

    <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html ...

最新文章

  1. 数学2.Latex扫盲
  2. EXTJS布局示例(panel,Viewport,TabPanel)
  3. php垂直居中代码_div标签:水平居中和垂直居中的实现(附代码)
  4. Android sendevent/getevent 用法
  5. BugKuCTF 加密 easy_crypto
  6. 大数据 智能交通调度_大数据技术在智能交通中的应用
  7. 利用ABAP调试模式修改SE16里数据库表的内容
  8. RocksDB事务实现TransactionDB分析
  9. windows版本下的 redis 集群配置
  10. WAS6.1在JDK1.5环境下JSP无法编译问题
  11. 博客园---博客美化汇总
  12. 可运行的C语言程序的拓展名,可运行的c语言程序的扩展名为什么?
  13. 一位前端工程师的Writing better code
  14. win10打开计算机出现马赛克,主编处理win10系统播放视频影片出现锯齿、马赛克、模糊的办法?...
  15. MAVEN工程引入p6spy打印sql语句日志(Spring+mybatis)
  16. Vue 路由 导航守卫(全局守卫、组件内守卫、路由独享守卫)
  17. 教你如何养微信小号,什么样的号可以群爆粉?
  18. error CS0246: 未能找到类型或命名空间名“A”(是否缺少 using 指令或程序集引用?)
  19. 数据中心空调系统基础知识-制冷量与热量计算
  20. HTML+css制作简单游戏界面

热门文章

  1. 【原生Ajax】全面了解xhr的概念与使用。
  2. 多种JS刷新页面代码!
  3. CISCO设备信息泄漏漏洞案例
  4. 【English】十大词性之感叹词(感叹句)
  5. 百万基建狂魔们的赛博世界
  6. XXX高校信息安全服务解决方案
  7. 如何在启动时禁用Razer突触启动画面
  8. 如何更新R以及RStudio
  9. OpenGL之glut、glfw、glew、glad等库之间的关系
  10. 友盟推送服务器配置文档,友盟使用指南