java web 解决中文乱码问题(全面总结)

时间:2022-04-25 23:48:09

     

  在开发一个完整的web项目时,总是会遇到各种各样的中文乱码问题,例如页面显示乱码,表单提交乱码,数据库存储乱码等          等,虽然目前也能找到各种各样的解决方案,但是大部分都没有总结全面。(我也遇到了中文乱码问题 这是我抄袭来的 如果原作者需要 请通知我删除)

(1)准备知识

  凡是会出现乱码的地方都是由于编码的问题产生的,页面默认编码为ISO-8859-1,简体中文编码为GB2312,中文汉字集(简体与   繁体)编码为GBK,国际编码为UTF-8。由于UTF-8编码支持的语言类型最广,所以在这里建议凡是用到字符编码的地方都使用       UTF-8格式接下来看看所有可能出现乱码场景的解决方案。

(2)页面显示乱码

  • html页面

  在页面的<head>标签内添加<meta>标签,内容如下

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  (建议这个)

  或者

<meta charset="utf-8">

  • jsp页面

 在jsp页面的顶部加上以下代码,重点是charset=UTF-8和pageEncoding="UTF-8"

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

 同时在<head>标签下添加<meta>标签,代码如下

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

 为了让所有新建的jsp页面默认为utf-8编码,可以在相应的IDE下设置。以eclipse为例,window > Prefrences > Web > JSP    Files > Encoding处改成支持UTF-8格式的选项。

java web 解决中文乱码问题(全面总结)

jsp页面编码设置

(3)客户端和服务器端传输乱码

  • tomcat配置

在tomcat安装目录下 > conf > server.xml,在server.xml文件中找到Connector port="8080"所在的标签,在标签内部添加URIEncoding="utf-8",添加后为

<Connector port="8080"

protocol="HTTP/1.1"

maxThreads="150"

connectionTimeout="200000"

redirecPort="8443"

URIEncoding="utf-8"/>

  • Request请求

例如以下请求方式

<a href="/myProject/displayServlet?username=张三&password=123">显示用户名和密码</a>

这种情况下,可以看出来该请求是GET请求,在接收请求时如果出现乱码,需要使用以下代码

username= new String(username.getBytes("ISO-8859-1"),"UTF-8")

在表单提交的时候,如果是POST请求,与GET请求不一样,添加的是以下代码

request.setCharacterEncoding("utf-8")

注意:request.setCharacterEncoding("utf-8")只在POST请求下生效

  • Response响应

在servlet中利用response进行输出时,如果出现乱码,需要添加以下代码

response.setContentType("text/html;charset=utf-8");

response.setCharacterEncoding("UTF-8")

  • struts.xml

如果使用了Struts2框架,在strust.xml文件中添加如下代码

<constant name="struts.i18n.encoding" value="UTF-8"></constant>

  • Filter

还有一种最保险的方法是添加自定义编码过滤器,或者使用spring自带的过滤器,在web.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>

(4)数据库插入乱码

在服务器获取到正确数据后,插入到数据库却出现乱码,很有可能是数据库的编码问题,按照以下方法来做可以避免这种问题

  • 安装

在数据库安装过程中会选择编码方式,此时选择utf-8格式

  • 创建数据库

在创建数据库的过程中,按照以下例子

CREATE DATABASE `share` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

  • 创建表

在创建表生成的SQL后面加上

ENGINE=InnoDB DEFAULT CHARSET=utf8;

  • 数据库连接(mysql)

在使用hibernate或者spring连接数据库时,按照以下例子

//hibernate.cfg.xml或者是applicationContext.xml

//要特别注意如果  写useUnicode=true&characterEncoding=UTF-8  出现错误,那就在&后加上  amp;  ,目的是转义

<property name="connection.url">

   jdbc:mysql://localhost:3306/数据库名字?useUnicode=true&amp;characterEncoding=UTF-8  
  </property>

(5)总结

 在完成上述的讲解后,基本不会出现乱码的情形,大家也可以尝试下。如果出现了乱码的情况,也不要着急,先冷静分析,乱码是 出现在哪一个环节,然后按照我讲的几部分去找对应的解决办法。

 同时也是教大家一种问问题的方式,先自己分析问题出在哪里,直接问别人“我的项目中出现了中文乱码,你能帮我看一下   么?”和“数据返回页面的时候出现乱码了,你能帮我看一下么?”你觉得别人会喜欢哪种提问方式呢?