当前位置: 代码迷 >> JavaScript >> Jsp 中文乱码缘故及处理
  详细解决方案

Jsp 中文乱码缘故及处理

热度:388   发布时间:2012-11-26 11:48:49.0
Jsp 中文乱码原因及处理

??????????

Java Web Project 中一定会用到Jsp文件,而乱码问题又是做项目中必须要小心的,因此Jsp乱码问题我们应不让其出现,如果出现了也应有办法来解决,下面是我整理的几类Jsp乱码问题,希望对各位同行有帮助,如果有不准确的地方还请大神指教留言。

?

1.?????? 页面显示乱码

?

? <% out.print(“中文”)%>

原因:<%@ page language="java" import="java.util.*"%>中没有设置页面的编码格式:

????????pageEncoding="GBK" 或是 pageEncoding="UTF-8"

???? (? 常用编码集

? ?????????????? ?UTF-8: 国际通用编码,包括世界各国语言字符.

? ??????????????? GBK:? 我国自己的编码集,汉字简体,繁体都支持.

?? ????????????? ?GB2312: 也是我国的编码集,但是不支持繁体,导致了GBK的出现.

? ???????????? ???ISO-8859-1: 收录ASCII字符,西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应

?????????????????? 的文字符号,无欧元符号,不支持中文,所以做项目时一定要修改Jsp

????????????????????????????????????? 编码,还有工程编码,这个如果大意了,那么结果可能很悲剧,切?

?????????????????? 记!!!本人一般都是使用UTF-8,我想大家应该都差不多吧~)

处理方法:将文件page指令中加入编码设置

????????? <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

?

2.?????? URL传值乱码

?

jsp中用<a>提交到本页面一个值,再在该页面中显示,在地址栏中就能看到乱码了

<%

<a href="xxx.jsp?param='中文'">提交一个值</a>

<% String param=request.getParament("param")

? ????????????????? ??out.print(param);//在页面显示为乱码

%>

原因:服务器不能识别中文。

处理方法: 如果你用的是tomacat那么就要添加一下它的conf文件夹下的server.xml文件中<Connector>标签中的属性 <URLEncoding="UTF-8"> 或是其他支持中文的编码。

?

3.?????? form提交乱码

?

原因:tomcat中对于post方式提交采用的默认编码是ISO-8859-1,不识别中文

?

处理方法:

?

.对提交后的request得到的值进行再编码设置,如:

<%

?????????????????? String username=request.getParameter("username");

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

???????????????? out.print(user);

%>

username按照原来默认的编码(ISO-8859-1)打乱,然后再用UTF-8进行重组。

该方法是有缺点的:

1.当提交的数据很多的时候,要对每个值进行处理,这是很费时费力的活,不划算。

2.如果不是原来的默认编码ISO-8859-1了,那么这种处理就没有用了,转换不到正确

? 的汉字。

所以基于以上几点,方法二更好

?

?.过滤器filter

?????? 既然表单的数据以post提交后都是封装在request对象中的,那么我们就在这里设置一个过滤器,是所有request对象中的数据都进行一遍重编码,实现把所有表单数据都处理,很是省事!强烈推荐。

?

下面是filter具体实现

?

-------------------------JSP文件---------------------

<body>

???????????????? <form action="MyJsp.jsp" method="post">

??????????????????????????? username: <input type="text" name="username"/>

???????????????????????????????????????????? ?<input type="submit" name="submit" value="submit">

?????????????????? </form>

?????????????????? <%

?????????????????? String username=request.getParameter("username");

?????????????????? ///String user=new String(username.getBytes("ISO-8859-1"),"UTF-8");这个方式有缺陷

???????????????? out.print(username);

?????????????????? %>

? </body>

?

?

----------------------------------------------------------

?

?

?

-----------------------Filter文件---------------------

package test;

?

import java.io.IOException;

?

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

?

/**

?* 编码-过滤器类

?* 实现过程:类属性->类构造方法->init()方法->doFilter()方法->destroy()方法

?* @author yzp

?*

?*/

public class SetCharactorEncoding implements Filter {//此处注意一定是implements javax.servlet.Filter 千万别错了!!!!

?

???????? private FilterConfig filterConfig;// 过滤器相关信息

???????? private boolean enable;// 启用过滤器的开关

???????? private String encodingName;// 目标编码方式名称

?

???????? /**

???????? ?* 构造方法

???????? ?*/

???????? public SetCharactorEncoding() {

?????????????????? super();

?????????????????? this.encodingName = "UTF-8";// 初始化-设置默认编码为UTF-8

?????????????????? this.enable = false;// 初始化-设置开关为关闭状态

???????? }

?

???????? /**

???????? ?* 初始化方法-与配置文件web.xml相对应

???????? ?*/

???????? public void init(FilterConfig filterConfig) throws ServletException {

?????????????????? // TODO Auto-generated method stub

?????????????????? this.filterConfig = filterConfig;// 初始化-filterConfig

?????????????????? String flag = this.filterConfig.getInitParameter("enable");

?????????????????? // 获得XML配置文件中的<init-param></init-param>中的值

?????????????????? if ("true".equals(flag)) {// flag=true 则过滤器开启

??????????????????????????? String encodeName = this.filterConfig

?????????????????????????????????????????????? .getInitParameter("encodingName");// 获得编码名称

??????????????????????????? this.enable = true;// 设置属性

??????????????????????????? this.encodingName = encodeName;// 设置属性

?????????????????? } else {

??????????????????????????? this.enable = false;// flag=false 则关闭过滤器

?????????????????? }

???????? }

?

???????? /**

???????? ?* 执行过滤器

???????? ?*/

???????? public void doFilter(ServletRequest request, ServletResponse response,

??????????????????????????? FilterChain chain) throws IOException, ServletException {

?????????????????? // TODO Auto-generated method stub

?????????????????? if (this.enable) {// 开关为开

??????????????????????????? request.setCharacterEncoding(this.encodingName);

??????????????????????????? // 设置request的编码为encodingName

?????????????????? }

?????????????????? chain.doFilter(request, response);

?????????????????? // 执行过滤器链-在有多个filter的时候,一个一个执行开着状态的过滤器

???????? }

?

???????? public void destroy() {// 销毁方法

?????????????????? // TODO Auto-generated method stub

?????????????????? this.encodingName = null;

?????????????????? this.enable = false;

?????????????????? this.filterConfig = null;

???????? }

?

}

?

?

----------------------------------------------------------

?

?

?

-----------------------XML文件----------------------

?

web.xml文件<web-app></web-app>

?

<filter><!-- 此处是filter标签,千万别写成了servlet,它是个特殊的servlet-->

??? <filter-name>SetCharactorEncoding</filter-name>

??? <filter-class>test.SetCharactorEncoding</filter-class>

??? <init-param>

??? ?????????????????? <param-name>encodingName</param-name>

??? ?????????????????? <param-value>UTF-8</param-value>

??? </init-param>

??? <init-param>

??? ?????????????????? <param-name>enable</param-name>

??? ?????????????????? <param-value>false</param-value>

??? </init-param>

? </filter>

? <filter-mapping>

??? <filter-name>SetCharactorEncoding</filter-name>

??? <url-pattern>/*</url-pattern>

? </filter-mapping>????????

?

----------------------------------------------------------

?

?

Jsp 编码设置


1.pageEncoding 是jsp向服务器提交时将中文按怎样的编码.
2.Eclipse/MyEclipse中设置Jsp文件中的默认 存储编码类型 为UTF-8
??? window->Preferences->General->Content Types->text下的jsp:Default encoding 修改为UTF-8
3.MyEclipse 新建Jsp文件模版设置 window>preference>MyEclipse>Files and Editors>JSP>JSP Templates但

?? 是没有UTF-8 有GBK,还有一种是通过路径改变jsp.vtl的 但是我试了不好用啊,以后找到对的方法再补上吧~

?

????????????????????????????????????????????????????????????????????????????????????????????????????????

?

?????????????????????????????????????????????????????????????????????????????????????????????????????? ??(又是一个不眠之夜,come on ,Jason!)

?

?


?

  相关解决方案