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

总结分类:

一、页面显示乱码

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

《未完待续。。。》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逸鹏说道

【开源】1句代码搞定图片批量上传,无需什么代码功底【无语言界限】

开源地址:https://github.com/dunitian/LoTUploader WebUploader基础上的封装改善,一句代码全部实现(样式美化,实...

31190
来自专栏逸鹏说道

锚点跳转的过渡效果

CSS实现:http://stackoverflow.com/questions/17631417/css-pure-css-scroll-animation ...

280100
来自专栏逸鹏说道

window.opener.location 安全风险讨论

在浏览器中,通过 <a> 标签或者 JavaScript 中的 window.open 函数,可以打开新页面。新页面的 window 对象中,存在一个 open...

37060
来自专栏安恒信息

Jsprime——一款JavaScript静态安全分析工具

如今,越来越多开发人开始将JavaScript作为其首选语言方案。理由很简单,JavaScript如今正越来越多地被视为应用程序的主流开发语言——无论是在Web...

34270
来自专栏逸鹏说道

动态加载JS 和 CSS

<script type="text/javascript"> $(function () { var filename = '/assets/css/main...

32750
来自专栏c#开发者

JavaScript和ASP.NET的传值

JavaScript和ASP.NET的传值 因项目需要,最近一段时间里对于js的开发有了一定的了解。在基于ASP.NET的开发中,经常性的需要JS脚本来增加一些...

48660
来自专栏逸鹏说道

基于HTML的PDF展示 pdf.js

很不错的一个插件,推荐给大家 pdf.js 是一个技术原型主要用于在 HTML5 平台上展示 PDF 文档,无需任何本地技术支持。 ? 在线演示:http://...

47280
来自专栏逸鹏说道

经典JS闭包面试题

大部分人都会做错的经典JS闭包面试题 目录 由工作中演变而来的面试题 JS中有几种函数 创建函数的几种方式 三个fun函数的关系是什么? 函数作用域链的问题 到...

54650
来自专栏逸鹏说道

js处理异常try{}catch(e){}

程序开发中,编程人员经常要面对的是如何编写代码来响应错误事件的发生,即例外处理(exception handlers)。如果例外处理代码设计得周全,那么最终呈现...

40050
来自专栏逸鹏说道

评论JS插件~多说+畅言

多说API:http://dev.duoshuo.com/docs/512d6e2e418847315a000001 发表评论 接口名称 /posts/crea...

1.2K100

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励