asp.net javascript处理url参数乱码的解决方法

作者:翅膀的初衷 来源:本站原创 发布时间:2014-04-09 查看数:61451

在Web开发当中,Url传参是一件十分常见的事情,但是如果参数中包含有汉字的话,出现乱码也是十分常见的事情!

常规情况下只要保证以下情况,就可以避免参数乱码:

1.保持文件编码一致!
这个一致,又体现在二个方面:
1) 所有文件的编码一致:做为一个Web开发者,代码文件(aspx,html,cs等),样式文件(css),脚本文件(js)编码要尽量统一!
2) 文档申明与文件保存编码一致:比如<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>,文档已经申明了是UTF-8,但是实际上这个申明与文件保存编码是没有任何关系的,不过正常情况下,大多数IDE(比如DW)会根据申明自动保存为正确的编码,但是不排除少见的一些IDE甚至直接就是记事本及异常导致的编码不一致的情况!

2.特殊字符做好编码!

而在编码过程中,asp.net后端编码一般使用HttpUtility.UrlEncode进行编码,而JS则使用escape,如果尝试使用js的unescape去解码UrlEncode处理的字符串是无法成功的------结果是另外一串乱码!
这是由于二者的处理机制不一样,escape 是将字符串转换为 Unicode 字符串。如果在后端编码需要前端JS解码的话,可以用HttpUtility.UrlEncodeUnicode替代HttpUtility.UrlEncode(注:escape或者HttpUtility.UrlEncodeUnicode编码的参数,在asp.net后台通过Request.QueryString取参时,可以自动解码,无法额外处理)

另外由于HttpUtility.UrlEncodeUnicode是被否决的方法,下面列出具体的该方法的实现代码供大家参考:

public  string  UrlEncodeUnicode(string  value,  bool  ignoreAscii)

{

        if  (value  ==  null)

        {

                return  null;

        }

        int  length  =  value.Length;

        StringBuilder  builder  =  new  StringBuilder(length);

        for  (int  i  =  0;  i  <  length;  i++)

        {

                char  ch  =  value[i];

                if  ((ch  &  0xff80)  ==  0)

                {

                        if  (ignoreAscii  ||  IsUrlSafeChar(ch))

                        {

                                builder.Append(ch);

                        }

                        else  if  (ch  ==  '  ')

                        {

                                builder.Append('+');

                        }

                        else

                        {

                                builder.Append('%');

                                builder.Append(IntToHex((ch  >>  4)  &  '\x000f'));

                                builder.Append(IntToHex(ch  &  '\x000f'));

                        }

                }

                else

                {

                        builder.Append("%u");

                        builder.Append(IntToHex((ch  >>  12)  &  '\x000f'));

                        builder.Append(IntToHex((ch  >>  8)  &  '\x000f'));

                        builder.Append(IntToHex((ch  >>  4)  &  '\x000f'));

                        builder.Append(IntToHex(ch  &  '\x000f'));

                }

        }

        return  builder.ToString();

}



public  char  IntToHex(int  n)

{

        if  (n  <=  9)

        {

                return  (char)  (n  +  0x30);

        }

        return  (char)  ((n  -  10)  +  0x61);

}



public  bool  IsUrlSafeChar(char  ch)

{

        if  ((((ch  >=  'a')  &&  (ch  <=  'z'))  ||  ((ch  >=  'A')  &&  (ch  <=  'Z')))  ||  ((ch  >=  '0')  &&  (ch  <=  '9')))

        {

                return  true;

        }

        switch  (ch)

        {

                case  '(':

                case  ')':

                case  '*':

                case  '-':

                case  '.':

                case  '_':

                case  '!':

                        return  true;

        }

        return  false;

}

原创作品,转载请注明作者与出处

作者:翅膀的初衷

来源:http://www.jiniannet.com