转自:http://www.blogjava.net/auditionlsl/archive/2009/05/26/278011.html
在网上搜了很多资料都没有搞定 , 一般都有以下几种说法 :
方法 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= 部门主管审批 )。
(看下一篇文章)