********************************************************************
*                                                 版权声明
*
* 本文以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<unzipStr.length;i++){
         var ac = unzipStr.charCodeAt(i);
         zipstr += ac;
         lens = lens.concat(ac.toString().length);
        }
        zipArray = zipArray.concat(zipstr);
        zipArray = zipArray.concat(lens.join("O"));
        return zipArray.join("N");
    }else{
        return encodeURI(unzipStr);
    }
}
function kdecode(zipStr,isCusEncode){
        if(isCusEncode){
        var zipArray = zipStr.split("N");
        var zipSrcStr = zipArray[0];
        var zipLens = zipArray[1].split("O");
        var uzipStr = "";
        
        for(var j=0;j<zipLens.length;j++){
            var charLen = parseInt(zipLens[j]);
            uzipStr+= String.fromCharCode(zipSrcStr.substr(0,charLen));
            zipSrcStr = zipSrcStr.slice(charLen,zipSrcStr.length);
        }        
        return uzipStr;
    }else{
        return decodeURI(zipStr);
    }
}

当然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
  
Updated :本来还担心QueryString的长度限制问题,后来阿不提供的相关的资料:IE地址栏的最大长度(-Maximum URL length is 2,083 characters in Internet Explorer.),也就放心了,应该不会超过这个限制的。

转载于:https://www.cnblogs.com/walkingboy/archive/2007/01/26/encodeURIAndFormAction_Chinese.html

encodeURI之URL中文参数问题相关推荐

  1. 框架页,URL中文参数乱码

    在web.config这样声明编码   <globalization requestEncoding="utf-8"  responseEncoding="utf- ...

  2. java中文 x_java环境url中文参数乱码处理

    在做搜索开发过程中,由于翻页功能需要,要把当前查询的中文条件放在URL中带到服务器进行下一页查询,结果出现乱码情况. 此时情况有如下两种: 1.在输入框输入搜索内容,直接通过from提交,参数值正常读 ...

  3. 关于HTTP GET请求的url中文参数编码

    场景:前端用JS构造了一个GET请求,携带了一个中文的参数,通过Spring MVC传到后台以后解析中文是乱码. 1. 发送请求,从浏览器中捕获到http的请求内容如下: 1 Remote Addre ...

  4. vue 给url 中文参数 添加编码解码

    // 解码用 decodeURIComponent(str) // 编码用 encodeURIComponent(str) 转载于:https://www.cnblogs.com/dudu123/p/ ...

  5. java 转换url中文参数

    当使用request对象获取用户提交的汉字字符时,会出现乱码问题,所以对含有汉子字符的信息必须进行特殊的处理. 首先,将获取的字符串用IOS-8859-1进行编码,并将编码存放到一个字节数组中,然后再 ...

  6. vue给url 中文参数 添加编码解码

    // 解码用 // decodeURIComponent(str) // 编码用 // encodeURIComponent(str)var test = '天天好心情ing' var a = enc ...

  7. JSP中文及传中文参数乱码解决方法小结

    在使用JSP的过程中,最使人头疼的一个问题就是中文乱码问题,以下是我在软件开发中遇到的乱码问题以及解决方法. 1.JSP页面乱码 这种乱码的原因是应为没有在页面里指定使用的字符集编码,解决方法:只要在 ...

  8. IE浏览器中文参数导致400 Bad Request问题研究(转)

    原文链接:https://www.jianshu.com/p/3816bb5ce3c9 问题描述 本人在使用Jboss-eap-7.1(内核是Wildfly)时,向服务器发送带中文url参数的Get请 ...

  9. Js的Url中传递中文参数乱码的解决

    一:Js的Url中传递中文参数乱码问题,重点:encodeURI编码,decodeURI解码: 1.传参页面 Javascript代码: 2. 接收参数页面:test02.html 二:如何获取Url ...

最新文章

  1. Programming C# 学习笔记(二) 出发:“Hello World”
  2. python接口自动化测试框架链接数据库_python接口自动化测试框架实现之操作mysq数据库...
  3. R语言广义线性模型函数GLM、glm函数构建泊松回归模型、模型中存在过离散(Overdispersion)、则将连接函数从possion函数替换为quasipoisson函数重新构建泊松回归模型
  4. docker 删除容器_Docker (二) Windows10专业版安装教程
  5. php获取谷歌地图api接口,谷歌地图 API 开发之信息窗口
  6. Windows下Core Audio APIs的使用简介
  7. shtml网页SSI使用详解
  8. python如何导入seaborn_Seaborn - 导入数据集和库
  9. Springboot中几个层的功能总结
  10. 万里坑路第一步:1、cocos2d-js的JDKADK,SDK,apaceANT安装和环境变量设置
  11. zotero文献管理工具的下载安装
  12. WO Mic -免费话筒
  13. 外显子bed文件获取
  14. Create React App无eject配置(react-app-rewired 和 customize-cra)
  15. 读书笔记: C# 7.0 in a nutshell (第 四 章 Advanced C#- 下)
  16. GwcNet:逐组相关的立体匹配网络(CVPR 2019)
  17. L2-003 月饼 作者 陈越单位 浙江大学
  18. java centos 缩略图_Nginx国人开发缩略图模块(ngx_image_thumb)
  19. YGG 西班牙 subDAO——Ola GG 正式成立
  20. ECCV 2022|文本图像分析领域再起波澜,波士顿大学联合MIT和谷歌提出全新多模态新闻数据集NewsStories

热门文章

  1. 2021年林州市高考成绩查询,林州市职业教育中心
  2. Analyzing RNA-seq data with DESeq2 deseq2官网 必须使用原始数据 raw_counts
  3. 《蓝桥杯CT107D单片机竞赛板》:独立按键模块
  4. 合法的出栈顺序判断(c++)
  5. 【学习笔记】无向图最小割
  6. Win11暂停更新点不了怎么办?Win11暂停更新是灰色的如何解决?
  7. 名词解释(普通二极管)
  8. 大数据系列之数据仓库Hive原理
  9. bugku ctf web4 (看看源代码吧)
  10. CV视觉论文Deep learning学习笔记(一)