encodeURI之URL中文参数问题
来源:百度文库 编辑:神马文学网 时间:2024/04/30 18:00:26
********************************************************************
* 版权声明
*
* 本文以Creative Commons的发布,请严格遵循该授权协议。
* 本文首发于博客园, 此声明为本文章中不可或缺的一部分。
* 作者网名: 浪子
* 作者EMAIL:dayichen (at)163.com
* 作者BLOG: Http://Www.Cnblogs.Com/Walkingboy
*
********************************************************************
encodeURI之URL中文参数问题
-Written by 浪子@cnblogs.com (07-01-26)
摘要:
我们在页面和页面间传递参数,最常用的一种方式就是通过url传递,如果涉及到中文或者其他特殊字符的时候,一般会使用encodeURI在Client端进行编码,Server端直接使用QueryString[]获取值(asp.net会自动帮我们进行解码),却无法料到,这样子也会出现错误,发现form的action地址竟然和url地址不符?asp.net在为form设置action的时候似乎进行了一定的编码(我还未知)......
一、Client端的QueryString:
自从使用了CallbackPlus之后,我们的编程模式越来越多的转向了Client端编码,而参数又经常通过url的形势传递,所以就写了个客户端的QueryString集中分析参数值
function QueryString(paraName){ var url = window.location.search; var para = url.substr(url.indexOf(paraName)); var andIndex = para.indexOf("&"); var paras; if(andIndex>-1){ paras = para.substr(0,para.indexOf("&")); }else{ paras = para; } var paraValue = paras.split("=")[1]; if(paraValue){ return decodeURI(paraValue); }else{return "";}; }
原来一直都使用的好好,今天一个同事突然跟我说,QueryString的时候,出现“被解码的URI不是合法的编码”。问题很奇怪,因为第一遍进入的时候,已经在Client端正确识别到了该参数,但是触发某按钮执行PostBack之后,就会出现该问题。经过检查,发现第一次进入页面的时候,IE URL和form的action地址不一样,PostBack之后IE URL被修改为跟from的action一样(参考demo代码的encodeURI.aspx)。经过测试之后,发现这个问题只存在于中文或者特殊字符编码的URL上。在网上查找了很多资料都没有得到正确答案(比如设置web.config 的requestEncoding,responseEncodeing.),与阿不沟通后也没能得到有效的解决方法。后来想,既然正常的URL不会出问题,那就把中文编码为非特殊的字串就好了......
二、自定义的编码和解码方法:
查找了很多编码和解码方法,一直都没有合适的,所以只能自己写一个这样的函数。因为这个编码和解码Client和Server都需要调用,所以也没有打算写得很复杂。
在查找资料的时候,从birdshome的解决WebControl的doPostBack参数传递问题 那里得到了一个按长度分割编码后字串的思路,觉得相对比较简单和好写,所以就决定暂时采用这种思路进行设计。
修改函数如下:
Client :
function QueryString(paraName,isCusEncode){ var url = window.location.search; var para = url.substr(url.indexOf(paraName)); var andIndex = para.indexOf("&"); var paras; if(andIndex>-1){ paras = para.substr(0,para.indexOf("&")); }else{ paras = para; } var paraValue = paras.split("=")[1]; if(paraValue){ return kdecode(paraValue,isCusEncode); }else{return "";}; } function kencode(unzipStr,isCusEncode){ if(isCusEncode){ var zipArray = new Array(); var zipstr = ""; var lens = new Array(); for(var i=0;i当然Server端也是需要对应的函数的:
public static string KEncode(string unzipStr) { return KEncode(unzipStr, false); } public static string KEncode(string unzipStr,bool isCusEncode) { if (isCusEncode) { string zipstr = string.Empty; StringCollection lens = new StringCollection(); char[] chars = unzipStr.ToCharArray(); for (int i = 0; i < chars.Length; i++) { int ac = (int)chars[i]; zipstr += ac.ToString(); lens.Add(ac.ToString().Length.ToString()); } string len = string.Empty; for (int i = 0; i < lens.Count; i++) { if (i+1 == lens.Count) { len += lens[i]; } else { len += lens[i]+"O"; } } return zipstr + "N" + len; } else { return HttpUtility.UrlEncode(unzipStr); } } public static string KDecode(string zipStr) { return KDecode(zipStr, false); } public static string KDecode(string zipStr, bool isCusEncode) { if (isCusEncode) { string[] zipArray = zipStr.Split(new string[1] { "N" }, StringSplitOptions.RemoveEmptyEntries); string zipSourceStr = zipArray[0]; string[] zipLens = zipArray[1].Split(new string[1] { "O" }, StringSplitOptions.RemoveEmptyEntries);//no Zero,is "O" string uzipStr = ""; for (int j = 0; j < zipLens.Length; j++) { int charLen = int.Parse(zipLens[j]); uzipStr += (char)(int.Parse((zipSourceStr.Substring(0, charLen)))); zipSourceStr = zipSourceStr.Remove(0, charLen); } return uzipStr; } else { return HttpUtility.UrlDecode(zipStr); } }三、后话:
可能这是最差的解决方案,不知道园子里是否有其他人发现这个问题,并且有更好的解决方案?
问题描述和解决方法demo代码示例:Download
encodeURI之URL中文参数问题 关于中文乱码问题的补充,主要正对URL参数有中文的问题。 有关URL地址传递参数中出现的中文乱码问题解决方法 Action接收URL中的参数 参数问题 URL长度问题 gcc 参数中文手册 中文化和国际化问题权威解析之五:URL编码/Misc 修改谷歌URL参数可执行实时搜索 JDBC URL格式及其参数说明 oracle mysql 搜索引擎优化之URL篇 搜索引擎优化之URL篇 URL 常用DOS命令参数的中文详解 Mysql JDBC URL中几个重要参数说明_扬扬飒飒 encodeURI/decodeURI与UrlEncode/UrlDecode URL网址规范化问题 - 798DIY的日志 - 网易博客 三种常见 URL 问题及补救办法 C语言之可变参数问题 - 欢迎阁下光临我的网络日志-safeking‘s blog - 博... liferay中文问题 Java中文&编码问题 libpcap关于callback函数参数传递问题 用XMLHTTP Post/Get HTML页面时的中文乱码问题之完全Script解决方案 用XMLHTTP Post/Get HTML页面时的中文乱码问题之完全Script...