escape不编码字符有69个:*,+,-,.,/,@,_,0-9,a-z,A-Z
encodeURI不编码字符有82个:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z
encodeURIComponent不编码字符有71个:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z
1.
JS: escape :
- js使用数据时可以使用escape
- 例如:搜藏中history纪录。
- 0-255以外的unicode值进行编码时输出%u****格式,其它情况下escape,encodeURI,encodeURIComponent编码结果相同。
2.
JS: encodeURI :
- 进行url跳转时可以整体使用encodeURI
- 例如:Location.href=encodeURI("http://cang.baidu.com/do/s?word=百度&ct=21");
3.
JS: encodeURIComponent :
- 传递参数时需要使用encodeURIComponent,这样组合的url才不会被#等特殊字符截断。
- 例如:<script language="javascript">document.write('<a href="http://passport.baidu.com/?logout&aid=7& u='+encodeURIComponent("http://cang.baidu.com/bruce42")+'">退出</a& gt;');</script>
使用GET方式提交数据的时候,中文问题很好解决,setRequestHeader("Content-Type","text/html; encoding=gb18030")就可以了。但这个方法在POST方式中却不起作用。大家都知道GET方式提交数据有长度限制,有时我们必须使用 POST方式来提交数据。
对于使用POST, JSP的解决方法如下:
使用escape(或encodeURI,两个函数都是JavaScript的函数,功能基本相同,可以查一下相关的帮助),但要使用两次,这个是关键。
初始页面内容如下( hello.jsp):
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>AJAX提交页面</title>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<script type="text/javascript">
function justdo(){
var post = "name=王力猛&email=wallimn@sohu.com&bokee=http://wallimn.bokee.com";
post = encodeURI(post);
post = encodeURI(post); //两次,很关键
var xmlObj = new ActiveXObject("Msxml2.XMLHTTP");
var URL = "act.jsp"; //文件名需要调整成测试时的相应位置
xmlObj.open("POST",URL,true);
xmlObj.setRequestHeader("Cache-Control","no-cache");
xmlObj.setRequestHeader("Content-Type","application/x-www-form-urlencoded;");
xmlObj.send(post); //注意:POST方式,使用这个来发送内容
}
</script>
</head>
<body>
<input type="button" value="提交" οnclick="justdo()" />
</body>
</html>
encodeURI() 函数可把字符串作为 URI 进行编码,字符将被十六进制的转义序列进行替换。
decodeURI() 函数可对 encodeURI() 函数编码过的 URI 进行解码。
js的encodeURI()后的字符一般为utf-8编码,如果服务器端编码为不同编码,则需要iconv转换。
<?php
$a = urlencode(iconv("gb2312", "UTF-8", "电影")); //等同于javascript encodeURI("电影");
echo $a;
$b = iconv("utf-8","gb2312",urldecode("%E7%94%B5%E5%BD%B1")); //等同于javascript decodeURI("%E7%94%B5%E5%BD%B1");
echo $b;
?>
来自:http://blog.csdn.net/lichkui/article/details/2119614
今天在使用ExtJS向Java后台传递参数时,后台程序获取的中文参数一直为乱码,使用了很多方法,均未解决,万般无奈之际,Baidu到一篇好文章,转载之,希望对自己及朋友们有所帮助!
js 相关代码:
function doFind(default_value){
var q_bureau_name = document.forms[0].q_bureau_name.value;
var defpars = '';
if(default_value != null){
defpars = '&default_value='+default_value;
}
var url = 'customeroperAction.do';
var pars = 'action=getbureaulist&sname=customerTel.TEL_BUREAU&q_bureau_name='+encodeURI(encodeURI(q_bureau_name))+defpars; //encodeURI 两次将文本字符串编码为一个有效的统一资源标识符 (URI)。
var my = new Ajax.Request(url,{method: 'post',parameters: pars,onComplete: show});
}
function show(originalRequest)
{
var BUREAUSPAN = document.getElementById("BUREAUSPAN");
BUREAUSPAN.innerHTML = originalRequest.responseText;
}
java 相关代码:
String q_bureau_name = Util.filter(request.getParameter("q_bureau_name"));
q_bureau_name = java.net.URLDecoder.decode(q_bureau_name, "UTF-8");
//ajax提交数据(post)的格式默认为utf-8,利用javascript的提供的escape()或encodeURI()方法.在服务器端接收的时候要使用java.net.URLDecoder.decode(value,"UTF-8")方法进行解码.
js相关知识:
escape 方法
对 String 对象编码以便它们能在所有计算机上可读,
escape(charString)
必选项 charstring 参数是要编码的任意 String 对象或文字。
说明
escape 方法返回一个包含了 charstring 内容的字符串值( Unicode 格式)。所有空格、标点、重音符号以及其他非 ASCII 字符都用 %xx 编码代替,其中 xx 等于表示该字符的十六进制数。例如,空格返回的是 "%20" 。
字符值大于 255 的以 %uxxxx 格式存储。
注意 escape 方法不能够用来对统一资源标示码 (URI) 进行编码。对其编码应使用 encodeURI和encodeURIComponent 方法。
encodeURI 方法
将文本字符串编码为一个有效的统一资源标识符 (URI)。
encodeURI(URIString)
必选的 URIString 参数代表一个已编码的 URI。
说明
encodeURI 方法返回一个编码的 URI。如果您将编码结果传递给 decodeURI,那么将返回初始的字符串。encodeURI 方法不会对下列字符进行编码:":"、"/"、";" 和 "?"。请使用 encodeURIComponent 方法对这些字符进行编码。
encodeURIComponent 方法
将文本字符串编码为一个统一资源标识符 (URI) 的一个有效组件。
encodeURIComponent(encodedURIString)
必选的 encodedURIString 参数代表一个已编码的 URI 组件。
说明
encodeURIComponent 方法返回一个已编码的 URI。如果您将编码结果传递给 decodeURIComponent,那么将返回初始的字符串。因为 encodeURIComponent 方法对所有的字符编码,请注意,如果该字符串代表一个路径,例如 /folder1/folder2/default.html,其中的斜杠也将被编码。这样一来,当该编码结果被作为请求发送到 web 服务器时将是无效的。如果字符串中包含不止一个 URI 组件,请使用 encodeURI 方法进行编码。