其实这个问题以前早就解决了,但是今天做项目时又发现了一个新的问题:js中必须使用encodeURI()而不使用escape()
下面来说说get方式传参的解决方案吧!
假设
movieName='风声';
playUrl='/movie/风声/风声.rm';
url="play.jsp?movieName="+movieName+"&playUrl="+playUrl
若按照上述的地址直接访问,则中文会变成乱码。必须使用encodeURI('风声')进行两次编码。如下:
url="play.jsp?movieName="+encodeURI(encodeURI(movieName))+"&playUrl="+encodeURI(encodeURI(playUrl))
服务器通过以下方式获取值:
movieName=URLDecoder.decode(movieName,"utf-8");
playUrl=URLDecoder.decode(playUrl,"utf-8");
至于为什么不能使用escape()以及为什么要进行两次编码,本人不是很清楚。若有知道的,请解释一下。
对两次编码的理解:当客户端将两次编码的数据传到服务器时,服务器会先对数据进行一次解码,然后再将处理过的数据传给访问的页面,此时在jsp/servlet中获取的数据是经过一次utf-8编码的数据,这样就能通过URLDecoder.decode(,"utf-8")获取到原来的值。
希望知道的,能给我指点一下。
该方法应该是jsp的页面中实现的,如用在Struts2的标签中无效.
<s:text name="label.fileLoad">:</s:text><img src="<s:property value="'upload/'+encodeURI(encodeURI(title))+'.'+fileExtName"/>" />
经过处理后返回空值.
没时间处理.先把搜到的资料集中,下面是用js的html编码转换
这次作东西, 使用dojo,发送rpc的时候将正文内容使用了html编码, 编码的js如下:
/**
encode the str to html code formate
*/
function encodeHtml(str){
var encodedStr = "" ;
if (str=="") return encodedStr ;
else {
for (var i = 0 ; i < str.length ; i ++){
encodedStr += "&#" + str.substring(i, i + 1).charCodeAt().toString(10) + ";" ;
}
}
return encodedStr ;
}
然后, 并不想把转化后的编码文字直接保存在数据库中,师兄说这样不好看, 于是, 写了java程序将html编码转换回来,代码如下:java
/**
* decode html strings which are encoded by the html format: &#"(unicode number)";
* into Chinese
*
* @param str
* @return gb2312 format String
*/
public static String decodeHtml(String str) {
if (str.equals(""))
return "" ;
String ret = "";
String[] toParse = str.split(";");
for (String s : toParse) {
ret += Character.toChars(Integer.parseInt(s.substring(2)))[0];
}
return ret;
}
其实上面的js是将文字都使用unicode的数字偏移量然后加上&# ;组成,java的toChars正好是将指定的字符(Unicode 代码点)转换成其存储在 char 数组中的 UTF-16 表示形式。
查看了一天,发现所有的中文都会变成unicode的编码,面在文件名的对应都是中文.
也就是说在一个jsp的页面上用一个"中.jpg"的图片,经过servlet后,中文的名称变成了一个XXXXXX的编码.而在文件的保存中是中文字.必须在servlet中修改,也就是在tomcat的server.xml中修改字符编码为UTF-8或者GBK.
应影响到到其它的网站.不能修改tomcat的文件.因此做罢.