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

经常发现有人被乱码困扰着,而我感觉比较幸运,很少为此烦恼过。

在这篇博客中,我将把我想到的一些与乱码有关的经验总结出来,供大家参考。

页面显示乱码问题

在一个网站中,有些页面会正常显示,然而,有些页面会显示成乱码。 如果发生这种情况,可以检查一下web.config和文件编码。

如果web.config是这样配置的:

<globalization fileEncoding="utf-8" />

而文件的编码不是UTF-8:

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

那么就会有乱码问题。

注意:反之是不是会出现乱码的。

1. 不设置fileEncoding,此时不会有乱码现象。

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

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

AJAX提交的数据乱码问题

AJAX技术流行了这么多年了,我想现在没有几个网站不使用这种技术的。 然而,有些人在使用AJAX时,遇到了乱码问题。

通过分析这类乱码案例中,我发现几乎都是采用这种方式向服务端提交数据: “key1=” + escape(value1) +“&key2=” + escape(value2)

这种方法在多数情况下,的确能够正常工作,然而遇到一些特殊字符,就行不通了。原因我后面再来解释。

我为这类不正确的方法准备了一个示例 (为了保持示例简单,我演示一个拼接URL),

页面代码如下:

<p><a 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>

服务端的代码就是从QueryString读取那些参数值,然后输出。由于代码实在太简单,就不贴出了。(可下载示例代码)

当我点击链接时,服务端返回了这样的结果:

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

注意:"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>

另外,我非常反感拼接这种提交数据:“key1=” + escape(value1) +“&key2=” + escape(value2)

因为这种代码的可读性太差了,在此,我建议在AJAX调用时,最好直接使用JQuery的$.ajax方法向服务端提交数据。

请看下面的示例代码(注意我为data属性赋值的方式):

<p><a href="javascript:void(0);">Click me! 【点击我】</a></p> <div></div> <script type="text/javascript"> $(function() { $("#btnTestParam").click(function() { $.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); } }); }); }); </script>

运行结果:

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

JavaScript中正确的URL编码方式

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

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

MSDN说的很清楚,我也没有必要再做解释。

不过,我想有人可能会问:我用POST提交数据呢?那可是不经过URL的。

是的,POST数据时,参数没有放在URL中,但是,仍然采用URL编码。

POST数据也采用URL编码,是因为:表单可以采用GET方式提交,那么数据将通过URL提交给服务器。

所以提交的数据都要经过URL编码。

我们再来看一下$.ajax是如何处理数据的提交过程的:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjyyfw.html