作者fbysss
msn:jameslastchina@hotmail.com?
blog:blog.csdn.net/fbysss
聲明:本文由fbysss原創,轉載請注明出處
關鍵字:亂碼
文件1:encode.jsp
<%@ page language="java" contentType="text/html; charset=GBK"
??? pageEncoding="GBK"%>
<%
??? String sFileName = "中文文件名.doc";
?? sFileName = java.net.URLEncoder.encode(sFileName);//代碼行1
%>
?<a href="javascript:decode('<%=sFileName%>');">decode</a>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=gbk" />
<body>
<script language="javascript">
function??? decode(filename){
?? location.href="decode.jsp?filename="+filename;//代碼行2
}
</script>
</body>
</html>
文件2:decode.jsp
<%@ page language="java" contentType="text/html; charset=gbk"
??? pageEncoding="gbk"%>
<%
??? String sFileName = request.getParameter("filename");
?sFileName = java.net.URLDecoder.decode(sFileName,"GBK");//代碼行3
?????out.println("filename:"+sFileName);
%>
????????看上去,這樣肯定可以達到要求了,但是事實不是這樣,javascript并不識別jsp編碼后的字符串:
用鼠標移動到鏈接上方時,可以看到IE狀態欄上的確是正確的編碼,即"%D6%D0%CE%C4%CE%C4%BC%FE%C3%FB.doc"
然而要注意的是:用鼠標右鍵點擊鏈接-〉屬性看到的URL是javascript:decode('?D?????t??.doc');后果可想而知,轉向后輸出的是亂碼。
?????? 弄了半天,轉UTF-8也是一樣,一個小問題整的很郁悶,最后想到,還得在js這里下手。
?????? 把encode.jsp代碼行1注釋掉,代碼行2前面加入一行:filename = encodeURI(filename);
看到一點進展:轉向后的url已經很規范了:filename=%E4%B8%AD%E6%96%87%E6%96%87%E4%BB%B6%E5%90%8D.doc,但是結果仍然是亂碼。為啥呢?注意觀察,前面的編碼和后面是不一樣的!
然而,javascript的EncodeURI沒有提供編碼參數,默然就是UTF-8.? 好,那么?sFileName = java.net.URLDecoder.decode(sFileName,"UTF-8");行不行呢?答案是:不行,原因我現在還沒找到,找到了會在此補充,如果哪位知道,還望指點。
解決辦法:把代碼行3替換成
sFileName=?new String(sFileName.getBytes("ISO-8859-1"), "UTF-8");
現在再看結果,已經是正常的中文了。
補充:Ajax中,servlet輸出中文之后,需要js讀取,同樣面臨編碼問題,可以采取如下方式:
在servlet中用URLEncoder編碼sText = URLEncoder.encode(sText,"UTF-8");
在js中用decodeURI解碼xText = decodeURI(xText);
posted on 2007-09-04 16:34
flyepp 閱讀(1217)
評論(0) 編輯 收藏 所屬分類:
Useful articles