在网上搜了很多资料都没有搞定,一般都有以下几种说法:

方法1:在后台中先获得字符串的iso-8859-1编码形式数组,再使用此数组实例一个UTF-8编码形式String类型字符串.

页面提交的url为:

leavesp?work=部门主管审批

后台处理:

String inStr=request.getParameter("work ");

String outStr = new String(inStr.getBytes("iso-8859-1"),"UTF-8");

方法2:在页面传递过来时先通过JavaScript将URL编码,再到后台进行解码:

页面部分:

<script type="text/javascript">

function dogetMethod(url)

{

//url编码前: leavesp?work=部门主管审批

url=encodeURI(url);

//url编码后:

leavesp?work=%E9%83%A8%E9%97%A8%E4%B8%BB%E7%AE%A1%E5%AE%A1%E6%89%B9

window.open(uri,’’,’’);

}

</script>

后台部分:(解码)

String inStr= request.getParameter("work ");

String outStr=java.net.URLDecoder.decode(inStr);

尝试过两种方法后好像都不行,在后台获取到的字符还是会乱码.试完之后真想哭.*o*

使用第一种方法后发现:

在请求(request)中获得的字符串是这样的: ²¿ÃÅÖ÷¹ÜÉóÅú

使用new String(inStr.getBytes("iso-8859-1"),"UTF-8");处理后字符成了: ����������

没法,只能再试第二种方法了,使用后发现:

在页面中使用encodeURI(url)后,字符串是这样的:

%E9%83%A8%E9%97%A8%E4%B8%BB%E7%AE%A1%E5%AE%A1%E6%89%B9

好像有希望了!!!!

应该只要在后台再来decoder一下就行了吧,偶是这样想的,也是这样做的:

在后台中:

String inStr= request.getParameter("work ");

outStr=java.net.URLDecoder.decode(inStr);

在请求中获得的字符串是这样的: éƒ¨é—¨ä¸»ç®¡å®¡æ‰¹

decoder处理后得出的字符串为: éƒ¨é—¨ä¸»ç®¡å®¡æ‰¹

这时候真想哭啊!!%#$%@@!@$$##

革命尚未成功,还需努力!!!

从第二种方法中发现:

在请求中获得的字符串已经乱码了,用decoder处不处理值都是一个样!!

明明我在页面传过来的值是已经encode过了的字符,而后来取出来却….,这是为什么呢?

难倒是页面编码设置得有问题?

看了一下页面编码是: pageEncoding="UTF-8"

改了!改成: pageEncoding="iso-8859-1"试试.

浏览页面上,发现页面上的中文变成了很多鿉之类的字符,不管了,再试下,还是一样的结果.涛声依旧!

忽然想到应该是在获得字符串之前,也就是在request. getParameter("work ");这之前的某个地方已经将URL进行了decoder,并且将获得的字符用Iso-8859-1的编码方式存储过了.

所以在request中会得到这些类似于鿉之类的字符,这种字符应该就是中文的iso-8859-1的形式!!

有办法了,既然已经获得了iso-8859-1编码形式的中文,那就只要再使用第一种方法(先获得字符串的iso-8859-1数组,再将它实例成UTF-8的字符串)来进行处理不就OK了!

试过之后果然OK!!!

处理中文乱码代码实现部分:

jsp页面:

<%@ page language="java" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<script type="text/javascript">

//开启网页对话脚本

function openDialog(url,width,height)

{

var property="status:no;center:yes;resizable:yes;scroll:yes;dialogWidth:"+width+"px;dialogHeight:"+height+"px;";

var ret=window.showModalDialog(url,'modalDialogwin',property);

if (ret == null || ret == "")

{return false;}

return true;

}

//查看待办工作脚本

function showork(url)

{

//将url地址进行编码

url=encodeURI(url);

//alert(url);

//调用openDialog方法开启网页对话框

openDialog(url,900,500)

}

</script>

<title>待办工作查看</title>

</head>

<body>

<!-- 部分代码略 -->

<table border="1" align="center">

<tr>

<td>

<a href="#" onclick="javascript:showork('leavesp?work=部门主管审批')">查看待办工作</a>

</td>

</tr>

</table>

</body>

</html>

页面部分就一个超连接,用来开启一个网页对话框,只是开启的这个对话框中请求的不是一个物理的页面,而是请求的一个servlet(leavesp),而且url中带有中文参数值(?work=部门主管审批)。

为了处理中文乱码部分能够在整个WEB系统中都能够使用到,所以将中文乱码处理写成了一个Filter(过滤器),并在web.xml中配置所有的请求都将经过这个Filter进行过滤。Filter部分的代码如下:

文件名:ProFilter.java

package com.util.filters;

import java.io.IOException;

import java.io.UnsupportedEncodingException;

import java.util.Enumeration;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class ProFilter implements Filter

{

protected FilterConfig filterConfig;

/**

* 初始化

*/

public void init(FilterConfig filterConfig) throws ServletException

{

this.filterConfig=filterConfig;

}

/**

* 将inStr转为UTF-8的编码形式

@param inStr 输入字符串

@return UTF-8的编码形式的字符串

@throws UnsupportedEncodingException

*/

private String toUTF(String inStr) throws UnsupportedEncodingException

{

String outStr = "";

if(inStr != null)

{

//outStr=java.net.URLDecoder.decode(inStr);//不用decode了,到这的时候就已经自动decode过了

//将字符串转为UTF-8编码形式

outStr = new String(inStr.getBytes("iso-8859-1"),"UTF-8");

}

return outStr;

}

/**

* 中文乱码过滤处理

*/

public void doFilter(ServletRequest svlrequest, ServletResponse svlresponse,

FilterChain chain) throws IOException, ServletException

{

//将Servlet请求与响应对象转换成HttpServlet请求与响应对象

HttpServletRequest request=(HttpServletRequest)svlrequest;

HttpServletResponse response=(HttpServletResponse)svlresponse;

//获得请求的方式(1.post or 2.get),根据不同请求方式进行不同处理

String method = request.getMethod();

//1.以post方式提交的请求,直接设置编码为UTF-8

if(method.equalsIgnoreCase("post"))

{

try

{

request.setCharacterEncoding("UTF-8");

catch (UnsupportedEncodingException e)

{

e.printStackTrace();

}

}

//2.以get方式提交的请求

else

{

//取出客户提交的参数集

Enumeration<String> paramNames = request.getParameterNames();

//遍历参数集取出每个参数的名称及值

while(paramNames.hasMoreElements())

{

String name = paramNames.nextElement();//取出参数名称

String values[] = request.getParameterValues(name);//根据参数名称取出其值

//如果参数值集不为空

if(values != null)

{

//如果参数值集中只有一个值

if(values.length == 1)

{

try

{

//调用toUTF(values[0])函数,(values[0]即第一个参数值)方法转换参数值的字元编码

String vlustr=toUTF(values[0]);

//并将该值以属性的形式藏在request

request.setAttribute(name, vlustr);

catch (UnsupportedEncodingException e)

{

e.printStackTrace();

}

}

//如果参数值集中有多个值

else

{

//遍历参数值集

for(int i=0;i<values.length;i++)

{

try

{

//回圈依次将每个值调用toUTF(values[i])方法转换参数值的字元编码

String vlustr=toUTF(values[i]);

values[i] = vlustr;

catch (UnsupportedEncodingException e)

{

e.printStackTrace();

}

}

//将该值以属性的形式藏在request

request.setAttribute(name, values);

}

}

}

}

//设置响应方式和支持中文的字元集

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

//继续执行下一个filter,无一下个filter则执行请求

chain.doFilter(request, response);

}

/**

* 销毁方法

*/

public void destroy()

{

}

}

过滤器部分,可用来处理页面提交的post和get方法产生的中文乱码问题。

Post方式提交的数据(form表单中提交的数据)只需要进行请求字符编码设置request.setCharacterEncoding("UTF-8");和响应设置response.setContentType("text/html;charset=UTF-8");设置就可以了。

Get方式提交的数据会包含在url中,(如:leavesp?work=部门主管审批),则需要取出参数名:Enumeration<String> paramNames = request.getParameterNames();(如:work)和取出参数值:String values[] = request.getParameterValues(name);(如:部门主管审批),然后再将参数值进行编码转换:outStr = new String(inStr.getBytes("iso-8859-1"),"UTF-8");

过滤器写好这后就需要到web.xml中<web-app>与</web-app>之间进行配置了,web.xml中配置如下:

<!-- 配置过滤器 -->

<filter>

<description>处理中文乱码过滤器</description>

<filter-name>ProFilter</filter-name>

<filter-class> com.util.filters.ProFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>ProFilter</filter-name>

<url-pattern>*</url-pattern><!-- 过滤所有请求,注:tomcat5请用/* -->

</filter-mapping>

这样配置之后只要页面有任何请求都会通过ProFilter进行中文处理了,就不会再发生中文乱码问题了。

那一串通过get传递过来的中文处理过程如下:

1.       在jsp页面的JavaScript里面进行编码处理:

url=encodeURI(‘leavesp?work=部门主管审批’)

编码后结果:url=leavesp?work=%E9%83%A8%E9%97%A8%E4%B8%BB%E7%AE%A1%E5%AE%A1%E6%89%B9

2.       因为在web.xml过滤器配置为<url-pattern>*</url-pattern>所以所有请求将会通过过滤器进行处理,此过滤器处理过程如下:

2.1获得参数名集合:

Enumeration<String> paramNames = request.getParameterNames();

String name = paramNames.nextElement();

2.1结果中有name=’work’;一值。

2.2通过参数名获得参数值:

String values[] = request.getParameterValues(name);

因work的值只有一个所以2.2的结果为:values[0]=’ éƒ¨é—¨ä¸»ç®¡å®¡æ‰¹’;(此处得到的是字符串:“部门主管审批”的iso-8859-1编码格式字符)

2.3获得字符串的UTF-8编码格式字符:

outStr = new String(inStr.getBytes("iso-8859-1"),"UTF-8");

2.3中获得的结果为outStr=“部门主管审批”.

至此中文已经正常了。

不过过滤器还没处理结束,还得将参数名对应的值(已经处理的值)再重新藏到请求中去。

2.4将参数名对应结果藏入请求中:

request.setAttribute(name, outStr);

通过2.4处理后,请求中的work的值就变成了:部门主管审批

2.5 继续执行下一个filter,无一下个filter则执行请求

chain.doFilter(request, response);

3.       通过过滤器之后,就可以进入请求中对应leavesp的servlet了(servlet就不做说明了),此时在servlet中通过String work=request.getParameter(“work”);就可以获得url中传递过来的中文参数值了,结果为work=” 部门主管审批”。

看到这里,你应该也已经会处理中文乱码问题了。赶紧试试!!^_^

简而言之,JavaWeb中页面乱码问题采用过滤器过滤,问题一般都能解决。

处理URL传递中文乱码问题的更多相关文章

  1. JS中文转换(UTF-8),url传递中文乱码解决

    来源于:http://blog.csdn.net/kuangfengbuyi/article/details/45557437 js合成url时,如果参数是中文,传到struts2中会乱码,解决办法如 ...

  2. URL传递中文乱码的问题

    在AJAX浏览器来进行发送数据时,一般它所默认的都是UTF-8的编码. 使用JQUERY中所提供的方法来做操作 encodeURI function verify() {    //解决中文乱麻问题的 ...

  3. .NET在IE9中页面间URL传递中文变成乱码的解决办法

     在.Net的项目中,鼠标点击查询按钮,转到查询页面,但URL中包含中文时,传到服务器端后,中文变成了乱码(只有IE9出现该问题).       尝试使用Server.UrlEncode()进行编码, ...

  4. Java中url传递中文参数取值乱码的解决方法

    java中URL参数中有中文值,传到服务端,在用request.getParameter()方法,得到的常常会是乱码,这将涉及到字符解码操作. 方法一: http://xxx.do?ptname=’我 ...

  5. 通过URL传递中文参数的乱码处理

    环境:web.xml中配置了 <filter> <filter-name>encodingFilter</filter-name> <filter-class ...

  6. url 传递中文参数乱码问题的终极解决方法。

    估计很多人在做web开发的时候,都会碰到过url传递中文参数,有时候会出现乱码的问题,但有些项目或者环境,又不会有问题.当遇到乱码的时候,上网找了很多解决方案,比如: 页面设置它的编码方式,改成utf ...

  7. jquery.ajax的url中传递中文乱码问题的解决方法

    jquery.ajax的url中传递中文乱码问题的解决方法   JQuery JQuery默认的contentType:application/x-www-form-urlencoded 这才是JQu ...

  8. 解决get方法传递URL参数中文乱码问题

    [转]解决get方法传递URL参数中文乱码问题 来自:http://www.javaeye.com/topic/483158 应用一:解决tomcat下中文乱码问题(先来个简单的) 在tomcat下, ...

  9. URL传递中文参数,大坑一枚,Windows与Linux效果竟然不一致(两种解决方法)

    下午,计划2个小时搞定,个人官网第6次升级,就可以干点轻松的事了,结果,下午多搞了2个小时,晚上又搞了2个小时,才搞定. 最后一个世界难题是,URL传递中文参数. 问题大致是这么出现的:我为" ...

随机推荐

  1. 没有启动 ASP.NET State service错误的解决方法

    具体错误如下: 异常详细信息: System.Web.HttpException: 无法向会话状态服务器发出会话状态请求.请确保已启动 ASP.NET State service,并且客户端和服务器端 ...

  2. python_matplotlib知识点总结

    文作为学习过程中对matplotlib一些常用知识点的整理,方便查找. 强烈推荐ipython无论你工作在什么项目上,IPython都是值得推荐的.利用ipython --pylab,可以进入PyLa ...

  3. C语言 static静态变量

    静态变量类型说明符是static. 静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在 静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间 ...

  4. 关于Unity中的Bmpfont的使用

    系统字体,不占空间,效果一般. 自己拖的.TTF文件形成的字体,占空间很大,有特殊效果.一个TTF字库差不多占用3M左右,之所以这么大,是因为里面包含了所有的字,就像一本字典一样,所以字符都在里面. ...

  5. 把py文件打成exe

    使用pyinstaller: pyinstaller -F -w -i manage.ico demo.py -F:打包为单文件-w:Windows程序,不显示命令行窗口-i:是程序图标,demo.p ...

  6. linux -- gedit快捷键

    Shortcuts for tabs:Ctrl + Alt + PageDown     Switches to the next tab to the left.Ctrl + Alt + PageD ...

  7. 【Java面试题】56 在JAVA中如何跳出当前的多重嵌套循环?

    在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break 语句,即可跳出外层循环.例如, public class xunhuan { pu ...

  8. 腾讯企业邮箱POP,SMTP分别是什么

    腾讯企业邮箱在做域名解析的时候不用做pop3和 smtp设置,可以使用下列的协议:   POP3/SMTP协议 接收邮件服务器:pop.exmail.qq.com (端口 110),使用SSL,端口号 ...

  9. [ExtJs] ExtJs4.2 数据模型Ext.data.Model学习

    Model代表应用程序管理的一些对象.例如,我们可能会为 我们想在系统中建模的现实世界中的一些物体像使用者.产品和汽车等定义一个Model.这些Model在 Ext.ModelManager中注册,被 ...

  10. array_diff 不注意的坑

    1)array_diff 是对比两个(或以上数组)的值的差集,注意是对比数组的值,和数组的键无关 2)是以第一个数组为对比对象,找上在第一个数组里有但其他数组里没有的值(可以同值但不同键的多个) 举个 ...