中文编码相关整理

一、传递中文时,如果不事先编码,浏览器会自动编码。

     自动编码的规则:

     1)、Get请求时,不同的浏览器使用不同的编码方式自动为中文参数编码,比如:Firefox/3.0.5 使用UTF-8, IE6使用GB2312.

     2)、Post请求时,浏览器会根据网页的<meta http-equiv="Content-Type" content="text/html;charset=gb2312" /> 中指定的编码进行对表单中的数据进行编码,然后发给服务器。

     因为不确定,所以在传递中文时都要进行事先编码处理,这是一条原则。

   

二、给中文编码时,无论javascript的编码函数,还是服务器(C#)的编码函数,都要注意其编码格式是什么。

     1)、javascript的encodeURI()(对应的解码函数为decodeURI())和encodeURIComponent()(对应的解码函数decodeURIComponent())

             它们的编码格式是“utf-8”;

     2)、服务器端的 Server.UrlEncode() 是根据本地程序设置的编码格式编码的,而HttpUtility.UrlEncode是用“uft-8”编码的;

 

三、使用Request.QueryString和Request.Form获取参数时,已经自动执行了一次解码,使用的解码格式是服务器默认设置的解码格式。

      1)、在web.config中统一设置全局的服务编码和解码格式:

             <globalization culture="zh-CN" uiCulture="zh-CN" requestEncoding="UTF-8" responseEncoding="gb2312" />

      2)、不明白ashx文件中的下面文字的作用:

            context.Response.ContentType = "text/plain";
            context.Request.ContentEncoding = Encoding.GetEncoding("utf-8");
            context.Response.ContentEncoding = Encoding.GetEncoding("utf-8");
            context.Response.Charset = "utf-8";

 

四、Get请求和Post请求的区别:

      1)、使用Get请求时,参数在URL中显示,而是用Post方式时,则不会显示;

              因为Get请求是在URL中的,所以对于浏览器缓存的问题要特别注意,这也就是为什么要加入时间戳函数的原因

                    type: "GET",
                    url: "TreeTypeHandler.ashx",
                    data: {
                        parentid: id,
                        folder: name,
                        type: "create",
                        math:Math.random()
                    },

                  window.open("ManageView.aspx?typename=" + typename + "&type=" + usertype + "&level=" + level + "&math=" + Math.random(), "_self");

      2)、Get请求发送数据量小(有大小限制),Post请求发送数据量大;

      3)、客户端使用get请求时,服务器端使用Request.QueryString来获取参数,客户端使用post请求时,服务器端使用Request.Form来获取参数。不要使用Request[“username”]。

     

  五、encodeURI()和encodeURIComponent()的区别

        1、encodeURI():

       该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。

       该方法的目的是对 URI 进行完整的编码,因此对以下在 URI 中具有特殊含义的 ASCII 标点符号,encodeURI() 函数是不会进行转义的:;/?:@&=+$,# 

      [提示] 如果 URI 的参数中含有不能转移的字符,则应当使用 encodeURIComponent() 方法分别对各参数进行编码。

 

    2、encondeURIComponent():

    

     该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。

 

     其他字符(比如 :;/?:@&=+$,# 这些用于分隔 URI 组件的标点符号),都是由一个或多个十六进制的转义序列替换的。 

 

    [提示] 此方法会编码URI中的特殊字符

 

    下面举例说明这两个方法的区别:

        document.write(encodeURIComponent("http://www.w3school.com.cn")+ "<br />")
        document.write(encodeURI("http://www.w3school.com.cn")+ "<br />")

        结果

       http%3A%2F%2Fwww.w3school.com.cn 
       http://www.w3school.com.cn

 

posted @ 2012-01-12 14:56  花香溪  阅读(276)  评论(0编辑  收藏  举报