解决ASP.NET中的各种乱码问题

这是原文地址:http://www.cnblogs.com/fish-li/archive/2012/10/14/2723631.html#_labelStart

总结分类:

一、页面显示乱码

1、如果web.config配置:<globalization fileEncoding="utf-8" />

如果文件编码不是UTF-8,则会乱码,反之不然。

2、不设置fileEncoding,不会乱码

3、fileEncoding="gb2312",文件以utf-8编码,此时也不会有乱码现象。

建议最好让所有文件都以UTF-8编码保存,从而解决这类乱码问题。

二、Ajax提交的数据乱码问题

URL拼写参数的时候,如果遇到一些特殊字符。

<p><a id="link2" href="#" target="_blank">escape</a></p>
<
script type="text/javascript">
    var
str = "aa=1&bb=" + escape("fish li + is me.") + "&cc=" + escape("大明王朝1368");
    $("#link2").attr("href", "/test_url_decode.ashx?method=escape&" + str);
</script>

输出结果:bb=fish li   is me.

解决办法:使用JQuery的$.param()

<script type="text/javascript">
    var
myobject = { aa: 1, bb: "fish li + is me.", cc: "大明王朝1368" };
    $("#link1").attr("href", "/test_url_decode.ashx?method=param&" + $.param(myobject));
</script>

输出结果:bb=fish li + is me

当然,也可以用$.ajax方式写:

$.ajax({
                url: "/TestParam.ashx", type: "GET", cache: false,
               
data: { id: 2,
                   
name: "fish li + is me.",
                   
tel: "~!@#$%^&*()_+-=<>?|",                   
                   
"x?x!x&x": "aa=2&bb=3&cc=汉字。"// 特殊的键名,值内容也特殊。
                   
encoding: "见鬼去吧。?& :)",
                   
中文键名: "大明王朝1368"
               
},
               
success: function(responseText) {
                    $("#divResult").html(responseText);
                }

  })

==>JavaScript中正确的URL编码方式

看过前面的示例,您有没有想过:为什么escape不能解决的问题,JQuery就能解决呢?

对于这个问题,我想还是先来看看MSDN中关于escape的说明:

escape方法不能用来对唯一资源标示符(URL)进行编码,请使用encodeURI和encodeURIComponent方法

从JQuery的实现方式也可以看出:encodeURI()其实也是不推荐在编码URL数据时使用的。

encodeURI用于对整个URL字符串进行编码,如汉字。某个参数值本身包含一些特殊字符,
例如:key = "x?x/x&x", value = "aa=2&bb=3&cc=汉字。",这个函数的结果将会不正确。
它通常用于编码URL路径中包含有类似汉字这种场合,不适合处理URL参数。
但是,URL路径中的目录名与文件名,我们可以选择英文字符,所以encodeURI通常没有机会使用。

三、ASP.NET中的编码方式

 提供了三种:

1、HttpUtility.UrlPathEncode

2、HttpUtility.UrlEncode

3、Server.UrlEncode

4、System.Uri这个类,它也有一些用于URL处理的方法。 比如EscapeUriString,EscapeDataString这二个方法,可用于URL路径与参数的编码任务。

面对这些方法,我该选择哪个?
(编码查询参数 时选择HttpUtility.UrlEncode(str) ,
并且在拼接URL时,采用 HttpUtility.UrlEncode(key) + "=" + HttpUtility.UrlEncode(value) 的方法。
如果要 编码URL中的路径,请使用HttpUtility.UrlPathEncode()

下面我来解释前面不建议使用的另外的一些方法的原因:
1. Server.UrlEncode: 这个方法其实也是调用HttpUtility.UrlEncode,只是它会尽量使用Response.ContentEncoding所表示的编码格式, 然而HttpUtility.UrlEncode(str)总是会使用UTF-8编码,如果你不希望被字符编码纠缠,那就应该放弃Server.UrlEncode , 毕竟UTF-8编码才是更好的选择。
2. 虽然System.Uri的那二个编码方法,也能实现我们需要的URL编码任务, 但是,当ASP.NET在填充Request.QueryString, Request.Form时,使用的解码方法是HttpUtility.UrlDecode, 因此,如果你执意选择使用System.Uri的相关的编码方法,显然就不能与解码方法匹配,后果如何就难说了。)这一堆解释啊

结论:

一个完整的URL可以简单地认为包含二个部分:文件路径(含目录) 和 查询参数(QueryString)
在编码时,一定要分开处理。
编码文件路径时,应该选择 encodeURI(JS),HttpUtility.UrlPathEncode 。
编码查询参数时,应该选择 encodeURIComponent,HttpUtility.UrlEncode,而且拼接方式应该是:Encode(key) + "=" + Encode(value)和HttpUtility.UrlEncode(key) + "=" + HttpUtility.UrlEncode(value)

绝对不能先把整个URL(包含查询参数)拼接起来了,再来考虑该选择哪个编码方法。

再说一遍:在JavaScript中使用escape肯定是错误的。

《未完待续。。。》

原文地址:https://www.cnblogs.com/xyang/p/2729146.html