`

处理URL传递中文乱码问题Pthill转载

阅读更多

作者:肖文伟

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

方法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:在页面传递过来时先通过JavaScriptURL编码,再到后台进行解码:

页面部分:

<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>

页面部分就一个超连接,用来开启一个网页对话框,只是开启的这个对话框中请求的不是一个物理的页面,而是请求的一个servletleavesp),而且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;

}

/**

*</spa

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics