• 转 脚本


    ********************************************************************
    *                                                 版权声明
    *
    * 本文以Creative Commons的知识共享署名-非商业性使用-相同方式共享发布,请严格遵循该授权协议。
    * 本文首发于博客园, 此声明为本文章中不可或缺的一部分。
    * 作者网名:    浪子
    * 作者EMAILdayichen (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);
                }
            }
  • 相关阅读:
    软件工程实践总结
    Axios使用总结
    个人作业——软件测评
    结对第二次作业-疫情统计可视化实现
    结对第一次——疫情统计可视化(原型)
    软工实践寒假作业(2/2)
    软工实践寒假作业(1/2)
    Springboot后端接口开发
    个人作业——软件工程实践总结&个人技术博客
    个人作业——软件评测
  • 原文地址:https://www.cnblogs.com/zwei1121/p/742004.html
Copyright © 2020-2023  润新知