zoukankan      html  css  js  c++  java
  • 解决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肯定是错误的。

    《未完待续。。。》

  • 相关阅读:
    Bash 命令的解析
    vscode ctrl+P 打开文件后固定文件
    Linux 使用 tree 命令生成文件目录结构
    分享一款“暗黑系列”Idea主题插件Material Theme【改】
    linux上搭建svn服务器并设置自启动
    springBoot项目里获取resource目录下的文件(可用于各种linux服务器部署)【我】
    linux下svn与apache整合搭建
    liunx设置utf-8
    Fiddler抓包,并修改请求数据
    解决vue+el使用this.$confirm,不能阻断代码往下执行
  • 原文地址:https://www.cnblogs.com/xyang/p/2729146.html
Copyright © 2011-2022 走看看