AjaxURL编码 utf-8 gb2312的界别

同等、问题之原因

URL就是网址,只要上网,就自然会因此到。

貌似的话,URL只能使英文字母、阿拉伯数字和某些标点符号,不可知用任何文字和符号。比如,世界上出英文字母的网址“http://www.abc.com”,但是没有希腊字母的网址“http://www.aβγ.com”(读作阿尔法-贝塔-伽玛.com)。这是因为网络标准[RFC
1738](http://www.ietf.org/rfc/rfc1738.txt)做了硬性规定:

“…Only alphanumerics [0-9a-zA-Z], the special characters
“$-_.+!*'(),” [not including the quotes – ed], and reserved
characters used for their reserved purposes may be used unencoded
within a URL.”

“只来字母和数字[0-9a-zA-Z]、一些特殊符号“$-_.+!*'(),”[不包括对引号]、以及某些保留字,才好不通过编码直接用于URL。”

当即意味着,如果URL中有汉字,就得编码后以。但是麻烦的是,RFC
1738尚未规定实际的编码方法,而是交由应用程序(浏览器)自己控制。这致使“URL编码”成为了一个繁杂的园地。

脚就是给我们看,“URL编码”到底有差不多混乱。我会依次分析四栽不同的图景,在列一样种植情形中,浏览器的URL编码方法都无平等。把其的出入解释清楚后,我加以什么用Javascript找到一个集合之编码方法。

次、情况1:网址路径中蕴含汉字

开辟IE(我之所以之凡8.0版本),输入网址“http://zh.wikipedia.org/wiki/春节”。注意,“春节”这两个字此时是网址路径的一部分。

翻看HTTP请求的峰信息,会发觉IE实际查询的网址是“http://zh.wikipedia.org/wiki/%E6%98%A5%E8%8A%82”。也就是说,IE自动将“春节”编码成了“%E6%98%A5%E8%8A%82”。

咱俩明白,“春”和“节”的utf-8编码分别是“E6 98 A5”和“E8 8A
82”,因此,“%E6%98%A5%E8%8A%82”就是比照顺序,在每个字节前加上%而博得的。(具体的转码方法,请参见我形容的《字符编码笔记》。)

当Firefox中测试,也得了平等的结果。所以,结论1即是,网址路径的编码,用之凡utf-8编码。

其三、情况2:查询字符串包含汉字

以IE中输入网址“http://www.baidu.com/s?wd=春节”。注意,“春节”这两个字此时属于查询字符串,不属于网址路径,不要与情况1混淆。

查HTTP请求的峰信息,会发觉IE将“春节”转化成了一个乱码。

切换到十六进制方式,才能够明白地来看,“春节”被更改成为了“B4 BA BD DA”。

咱俩知晓,“春”和“节”的GB2312编码(我的操作系统“Windows
XP”中文版的默认编码)分别是“B4 BA”和“BD
DA”。因此,IE实际上即便是将查询字符串,以GB2312编码的格式发送出。

Firefox的拍卖措施,略有不同。它发送的HTTP
Head是“wd=%B4%BA%BD%DA”。也就是说,同样用GB2312编码,但是于每个字节前增长了%。

用,结论2虽是,查询字符串的编码,用之是操作系统的默认编码。

季、情况3:Get方法变的URL包含汉字

前方说的凡直接输入网址的景,但是再次常见的事态是,在已经打开的网页上,直接用Get或Post方法发生HTTP请求。

冲台湾中兴大学吕瑞麟先生的试验,这时的编码方法由网页的编码决定,也就是是出于HTML源码中字符集的设定控制。

  <meta http-equiv=”Content-Type”
content=”text/html;charset=xxxx”>

若果地方就无异行最终之charset是UTF-8,则URL就因为UTF-8编码;如果是GB2312,URL就因GB2312编码。

比喻来说,百度是GB2312编码,Google是UTF-8编码。因此,从它们的物色框中检索和一个词“春节”,生成的询问字符串是休雷同的。

百度生成的凡%B4%BA%BD%DA,这是GB2312编码。

Google生成的凡%E6%98%A5%E8%8A%82,这是UTF-8编码。

就此,结论3纵是,GET和POST方法的编码,用底凡网页的编码。

五、情况4:Ajax调用的URL包含汉字

眼前三种情景还是由浏览器发出HTTP请求,最后一栽情况则是由于Javascript生成HTTP请求,也便是Ajax调用。还是根据吕瑞麟先生的章,在这种情形下,IE和Firefox的处理方式完全不一样。

举例来说来说,有这么简单履代码:

  url = url + “?q=” +document.myform.elements[0].value; //
假定用户以表单中提交的价是“春节”这点儿个字

  http_request.open(‘GET’, url, true);

这就是说,无论网页使用啊字符集,IE传送给服务器的连天“q=%B4%BA%BD%DA”,而Firefox传送给服务器的连日“q=%E6%98%A5%E8%8A%82”。也就是说,在Ajax调用中,IE总是采取GB2312编码(操作系统的默认编码),而Firefox总是利用utf-8编码。这就是我们的结论4。

六、Javascript函数:escape()

吓了,到者结束,四栽情形尚且说罢了。

倘前面你还扣留明白了,那么此时而该会深感特别腻。因为,实在太烂了。不同之操作系统、不同之浏览器、不同的网页字符集,将招致了两样之编码结果。如果程序员要管每一样种结果都考虑进去,是无是无限害怕了?有没来法子,能够确保客户端只所以同栽编码方法向服务器发出请求?

答是片,就是用Javascript先对URL编码,然后再向服务器交由,不要让浏览器与的时机。因为Javascript的输出总是一样的,所以就保证了服务器得到的数目是格式统一之。

Javascript语言用于编码的函数,一共来三独,最古老的一个就是是escape()。虽然这个函数现在已经不提倡用了,但是出于历史原因,很多地方还当运它们,所以来必不可少先由它张嘴起。

事实上,escape()不可知一直用于URL编码,它的实在意图是返回一个字符的Unicode编码值。比如“春节”的返结果是%u6625%u8282,也就是说在Unicode字符集中,“春”是第6625单(十六进制)字符,“节”是第8282单(十六进制)字符。

其的实际规则是,除了ASCII字母、数字、标点符号“@ * _ + – .
/”以外,对另外具有字符进行编码。在\u0000到\u00ff之间的标记为转成%xx的款型,其余符号被转成%uxxxx的样式。对应之解码函数是unescape()。

因而,“Hello
World”的escape()编码就是“Hello%20World”。因为空格的Unicode值是20(十六进制)。

再有少Ajax独地方用小心。

首先,无论网页的原始编码是什么,一旦被Javascript编码,就还变为unicode字符。也就是说,Javascipt函数的输入和出口,默认都是Unicode字符。这同点对下两只函数也适用。

说不上,escape()不对“+”编码。但是咱解,网页在交付表单的下,如果出空格,则会受转正为+字符。服务器处理数据的时候,会把+号处理成空格。所以,使用的时刻如果小心。

七、Javascript函数:encodeURI()

encodeURI()是Javascript中确用来针对URL编码的函数。

其相于对所有URL进行编码,因此除普遍的记号以外,对另部分每当网址中出非常含义的号子“;
/ ? : @ & = + $ ,
#”,也不进行编码。编码后,它输出符号的utf-8形式,并且于每个字节前加上%。

它们对应之解码函数是decodeURI()。

需留意的是,它不针对单引号’编码。

八、Javascript函数:encodeURIComponent()

最后一个Javascript编码函数是encodeURIComponent()。与encodeURI()的界别是,它用来对URL的一些进行个别编码,而未用于对合URL进行编码。

因此,“; / ? : @ & = + $ ,
#”,这些在encodeURI()中未让编码的号子,在encodeURIComponent()中均会为编码。至于实际的编码方法,两者是千篇一律。

她对应的解码函数是decodeURIComponent()。

————————————————————————————————————————————————————————————

附件  编码表

 

 

下是为此 URL 编码形式表示的 ASCII 字符(十六前进制格式)。

十六进制格式用于在浏览器和插件中显示不标准的假名和字符。

URL 编码 – 从 %00 到 %8f

ASCII Value URL-encode ASCII Value URL-encode ASCII Value URL-encode
? %00 0 %30 ` %60
  %01 1 %31 a %61
  %02 2 %32 b %62
  %03 3 %33 c %63
  %04 4 %34 d %64
  %05 5 %35 e %65
  %06 6 %36 f %66
  %07 7 %37 g %67
backspace %08 8 %38 h %68
tab %09 9 %39 i %69
linefeed %0a : %3a j %6a
  %0b ; %3b k %6b
  %0c < %3c l %6c
c return %0d = %3d m %6d
  %0e > %3e n %6e
  %0f ? %3f o %6f
  %10 @ %40 p %70
  %11 A %41 q %71
  %12 B %42 r %72
  %13 C %43 s %73
  %14 D %44 t %74
  %15 E %45 u %75
  %16 F %46 v %76
  %17 G %47 w %77
  %18 H %48 x %78
  %19 I %49 y %79
  %1a J %4a z %7a
  %1b K %4b { %7b
  %1c L %4c | %7c
  %1d M %4d } %7d
  %1e N %4e ~ %7e
  %1f O %4f   %7f
space %20 P %50 ? %80
! %21 Q %51   %81
" %22 R %52 ? %82
# %23 S %53 ? %83
$ %24 T %54 ? %84
% %25 U %55 %85
& %26 V %56 ? %86
%27 W %57 ? %87
( %28 X %58 ? %88
) %29 Y %59 %89
* %2a Z %5a ? %8a
+ %2b [ %5b ? %8b
, %2c \ %5c ? %8c
%2d ] %5d   %8d
. %2e ^ %5e ? %8e
/ %2f _ %5f   %8f

URL 编码 – 从 %90 到 %ff

ASCII Value URL-encode ASCII Value URL-encode ASCII Value URL-encode
  %90 ? %c0 ? %f0
%91 ? %c1 ? %f1
%92 ? %c2 ò %f2
%93 ? %c3 ó %f3
%94 ? %c4 ? %f4
? %95 ? %c5 ? %f5
%96 ? %c6 ? %f6
%97 ? %c7 ÷ %f7
? %98 ? %c8 ? %f8
? %99 ? %c9 ù %f9
? %9a ? %ca ú %fa
? %9b ? %cb ? %fb
? %9c ? %cc ü %fc
  %9d ? %cd ? %fd
? %9e ? %ce ? %fe
? %9f ? %cf ? %ff
  %a0 ? %d0    
? %a1 ? %d1    
? %a2 ? %d2    
? %a3 ? %d3    
  %a4 ? %d4    
? %a5 ? %d5    
| %a6 ? %d6    
§ %a7   %d7    
¨ %a8 ? %d8    
? %a9 ? %d9    
? %aa ? %da    
? %ab ? %db    
? %ac ? %dc    
? %ad ? %dd    
? %ae ? %de    
? %af ? %df    
° %b0 à %e0    
± %b1 á %e1    
? %b2 ? %e2    
? %b3 ? %e3    
? %b4 ? %e4    
? %b5 ? %e5    
? %b6 ? %e6    
· %b7 ? %e7    
? %b8 è %e8    
? %b9 é %e9    
? %ba ê %ea    
? %bb ? %eb    
? %bc ì %ec    
? %bd í %ed    
? %be ? %ee    
? %bf ? %ef    

相关文章