hg008新2

浏览器,乱码,

该方法的,目的是对,URI进行完整,的,编码,★因此☆therefore★对以下,在,URI中,具有特殊含义的ASCII标点符号,encodeURI()函数是,不会进行转义的,:;/?:@&=+$,#[★提示☆tips★,]如果URI,的参数中含有,不能转移,的,字符,则应当使用encodeURIComponent()方法,分别,对各,参数进行编码,。[★提示☆tips★]此方法会编码URI中的特殊字符,decodeURIComponent(),decodeURIComponent()函数可对encodeURIComponent(,)函数编码的URI,进行解码,。上班一条虫迅雷下载,魔刀传说,安卓智能手机论坛,村民66套回迁房,成都列五中学,搞定岳父大人下载,补天道,网络书籍,痣的位置与命运图,。

(转)Ajax 异步 请求,FF IE区别 默认编码 ★如何☆rú hé★,转换作者,:西门 日期:2010-03-08参数编码,规范一.摘要★我们☆wǒ men★经常要在,页面传递★中文☆zhōng wén★数据,★但是☆dàn shì★往往被文字,编码所,困惑.有时不了解到底是浏览器编码★问题☆wèn tí★还是,★服务☆fú wù★器,编码★问题☆wèn tí★.本文分析了互联网,传递,数据,的编码原理,。并且,提出了完善易用的★解决☆jiě jué★方案.二.原则避免在,get或者post参数时,直接,传递,★中文☆zhōng wén★字符.中文参数需要经过编码后再传递.★服务☆fú wù★器,端要使用相同的,编码格式进行解码三.,错误★观点☆guān diǎn★1.很多程序员认为url中★可以☆ kě yǐ★,传递中文,. url中并不能携带中文参数.如果★我们☆wǒ men★在,浏览器中输入http://localhost/?a=中文,★★感☆gǎn★觉☆gǎn jué★上我们在url中带了中文,实际上当,按下回车,键后,浏览器自动将其中的中文汉字进行,编码,后传递给服务器,.2.,当获取中文参数,产生了乱码,时,。往往首先检查,服务器端程序的编码,格式.很多人认为url★可以☆ kě yǐ★,传递中文,不★知道☆zhī dao★浏览器,有自动,编码的行为,。所以,单纯的,认为,问题,出在服务器,端.,其实即使在服务器,端找到了正确的编码格式,我们也不★应该☆yīng gāi★轻易地改变服务器,的默认编码格式,. 3.,传递,参数,前编码,使用Request对象,获取参数时解码,很多的,程序员,认为认为,传递参数时我们使用UrlEncode等,方式,编码。,在接收,时★应该☆yīng gāi★,使用UrlDecode解码,.这是★常见☆cháng jiàn★的错误,请大家,一定要★注意☆zhù yì★,使用默认的,Request.QueryString和Request.Form时★已经☆yǐ jing★自动,执行了★一次☆yī cì★解码,使用的解码格式,是服务器,端,设置的默认编码格式,.四.,原因传递中文字符时,自动的编码,解码格式和浏览器与,服务器的,设置,有关.测试Firefox3和IE6的Get方式发送,中文参数。Firefox默认使用UTF-8格式编码中文参数。,而IE6即使在高级,设,置中,设置,了总是以 UTF-8 发送URL,。仍然自动,使用,GB2312编码中文参数对于服务器端,我们,可以自由,的控制解码,的格式.★但是☆dàn shì★往往是,通过更改,服务器配置进行全局的统一设置比如对于ASP.NET程序.可以在Web.Config中设置,服务器,段的,编码和解码格式:<globalization culture=zh-CN uiCulture=zh-CN, requestEncoding=UTF-8 responseEncoding=gb2312 />但是我们,没法控制浏览器端行为.用户,★可能☆kě néng★使用不同的浏览器五.,★解决☆jiě jué★方案1.统一默认的编码格式(,1)设置服务器端的,编码格式为UTF-8(2),传递参数★全部☆quán bù★进行编码服务器,端(C#,)使用Server.UrlEncode方法,★客户☆kè hù★端(javascript)使用encodeURIComponent方法.说明:★客户☆kè hù★端的,javascript函数encodeURIComponent★只能☆zhǐ nénɡ★使用UTF-8编码格式. 所以需要,设置服务器端request和response都为UTF-8.,缺陷是如果★某些☆mǒu xiē★★合作☆hé zuò★伙伴,必须,传递,★其他☆qí tā★的编码格式的参数。则,服务器,端或获取到乱码.此方案实现简单,适合,★大部分☆dà bù fen★场景,.2.,通过编码,参数,指定编码格式为了解决★可能☆kě néng★存在的★无法☆to be★统一编码格式的问题。我们,使用一个参数,encoding来显示,的指定,编码格式.encoding参数,需要在所,有的请求中传递,无论是get还是post.(1),对于javascript客户端编码而言。仍然使用encodeURIComponent方法编码,。此时指定encoding参数,的值为,UTF-8.(,2) 对于,传入给,服务器端的★其他☆qí tā★编码格式。比如GB2312。我们不能,使用默认的Request.Form或者,QueryString方法进行编码,.因为服务器端的编码格式可能设置为了UTF-8.此时使用 Request.Form或者,QueryString会自动,使用服务器端指,定的编码格式进行解码., 所以,需要,使用下面的方法★自己☆zì jǐ★处理请求,获取参数:        /// <summary>        /// 根据,指,定的编码格式,返回请求的参数集合 ziqiu.zhang 2009.1.19        /// </summary>        /// <param name=request>当前,请求的request对象</param>        /// <param name=encode>编码格式字符串</param>        /// <returns>键为参数名,值为参数值,的NameValue集合,</returns>        public static NameValueCollection GetRequestParameters(HttpRequest request。string encode)        {            NameValueCollection result = null;            Encoding destEncode = null;            //获取指定,编码,格式的Encoding对象             if (!,String.IsNullOrEmpty(encode),)            {,                try                {                    //获取指定的编码格式                    destEncode = Encoding.GetEncoding(encode);                },                catch                 {                    //如果获取指定编码格式失败,则设置为null                    destEncode = null;                },            }            //根据不同的HttpMethod方式,获取,请求的,参数.如果没有Encoding对象,则使用服务器端默认的编码.            if (request.HttpMethod == POST)            {,                if (,null !,= destEncode)                {                    Stream resStream = request.InputStream;                    byte< > filecontent = new byte;                    resStream.Read(filecontent。0。filecontent.Length);                    string postquery = destEncode.GetString(filecontent);                    result = HttpUtility.ParseQueryString(postquery。destEncode);                }                else                {                    result = request.Form;                }            }            else            {,                if (null !,= destEncode),                {                    result = System.Web.HttpUtility.ParseQueryString(,request.Url.Query。destEncode);                }                else                {                    result = request.QueryString;                }            }            //返回结果            return result;        } 通过上面的,方法。,无论是,Get请求,还是Post请求,。我们都可以,使用,★自己☆zì jǐ★指定的编码,格式获取参数.如果有人认为,写这个方法,是在,自找麻烦,请看二.,错误★观点☆guān diǎn★中的第三条.,此方法返回的是一个NameValueCollection对象,判断是否有某个参数时不能使用检查是否存在key值,的,方法.而是要通,key获取值,然后,判断值是否,为null(,和List有些不同,):                //获取,参数。假设paramList是一个NameValueCollection对象,                  p1= paramList;                //判断是否,存在此参数,如果不存在则p1为,null                if (, !(, String.IsNullOrEmpty(p1)  )                {...,} 另外本方法如果,没有传递Encoding或者传递的字符串★无法☆to be★转换成强类型,的Encoding对象。则使用服务器端默认编码,格式(即直接,使用,Request对象的QueryString和,Form获取参数).六.Javascript编码,方法发送请求的一方叫做客户端.,我们,经常,需要使用Javascript在,客户端,编码中文参数,.下面javascript中和编码有关的函数:函数名称函数说明,解释escape()escape() 函数可对字符串进行编码,★这样☆zhè yàng★就可,以在★所有☆suǒ yǒu★的,计算,机上读取该字符串。该方法不,会对, ASCII, 字母和,数字进行编码,也不会对,下面★这些☆zhè xie★, ASCII, 标点符号进行编码: -, _ . ! ~, * ( ) 。其,他所,有的字符都,会被转义序列替换,。 <已过时 > 请使用, encodeURI(,) 或, encodeURIComponent()unescape(,)unescape() 函数可对,通过 escape() 编码,的,字符串,进行,解码。该函数,的★工作☆gōng zuò★原理是★这样☆zhè yàng★的:通过找到★形式☆xíng shì★为 %xx 和 %uxxxx 的字符序列,(x 表示十六进制的,数字),用 Unicode 字符 u00xx 和 uxxxx 替换,这样的字符序列进行解码,。 <已过时 > 请使用 decodeURI() 或, decodeURIComponent()encodeURI()encodeURI() 函数,可把字符串作为 URI 进行编码。 该方法不会对 ASCII, 字母,和,数字进行编码,也不会对★这些☆zhè xie★ ASCII, 标点符号进行编码: - _ . ! ~ *, ( ) 。该方法的目的是对 URI, 进行完整,的编码,★因此☆ yīn cǐ★对以下,在 URI, 中,具有,特殊含义的 ASCII, 标点符号,encodeURI(,) 函数是,不会进行转义的,:;/?:@,&=+$,# <★提示☆tí shì★ > 如果 URI, 的参数中含有,不能转移的字符,则应当,使用 encodeURIComponent(), 方法分别对各参数,进行编码。,decodeURI()decodeURI() 函数可对 encodeURI(,) 函数,编码过的 URI 进行解码。  encodeURIComponent()encodeURIComponent(), 函数,可把字符串作为, URI 组件,进行编码。, 该方法不会对 ASCII, 字母和,数字,进行编码,也不,会对,这些 ASCII, 标点符号,进行编码: -, _ . !, ~, *, (, ) 。其他字符(比如 :;/?,:@&=+$,# 这些用于分隔 URI 组件,的标点符号,),★都是☆doushi★由一个或,多个,十六进制的,转义序列替换的。 <★提示☆tí shì★ > 此方法,会编码URI,中的特殊字符,decodeURIComponent()decodeURIComponent() 函数可对 encodeURIComponent() 函数编码,的 URI 进行解码。  escape和, unescape在V3版本的标准中,★已经☆yǐ jing★不在推荐使用.应该用encodeURI和encodeURIComponent方法对于一个,URI(URL也 是一中,URI),如果我们★希望☆xī wàng★将它作为完整,的网址发送,请求。但是,上,面带有中文。则应该,使用encodeURI方法.如果是要编码参数,则应该,使用encodeURIComponent.,下面举例说明,这两个方法的区别:document.write(encodeURIComponent(http://www.w3school.com.cn)+, <bt />)document.write(encodeURI(http://www.w3school.com.cn)+, <bt />)结果http%3A%2F%2Fwww.w3school.com.cnhttp://www.w3school.com.cn七.浏览器,自动编码Get请求对于Get方式发送的请求,。,不同的浏览器使用不同的编码方式自动,为中文参数编码.比如:Firefox/3.0.5 使用UTF-8。IE6使用GB2312.Post请求对于Post方式发送的请求。表单中的,参,数值对是,通过request body发送给服务器,此时浏览器会根据网页,的ContentType(text/html; charset=GBK)中指定的编码进行,对,表单中的数据,进行,编码,然后发给服务器,。在HTML代码,的Head中,添加:<meta http-equiv=Content-Type content=text/html;charset=gb2312 />Firefox/3.0.5 会使用根据charset中设置的编码,格式编码post的,中文参数.IE6不起作用.实验表明使用客户端,浏览器,默认编码格式具有,不确定性.,所以,传递中文时我们要手工编码参数.八.总结,写这篇,文章的目的是提醒,Web程序员要★注意☆zhù yì★浏览器,的自动编码。在一个项目中按照,本文提供的,解决方案,将,避免中文,参数,传递带来的乱码问题.在看了YJingLees Blog的CnBlogs博文排版技巧后我对本文重新进行了,整理.

本文链接:http://www.alijia.cc/ldriudk.html