前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >解决ASP.NET中的各种乱码问题

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

作者头像
小端
发布2018-04-16 11:34:12
1.7K0
发布2018-04-16 11:34:12
举报
文章被收录于专栏:java架构师java架构师

总结分类:

一、页面显示乱码

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肯定是错误的。

《未完待续。。。》

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2012-10-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档