AjaxUEvoqueL编码 utf-8 gb2312的区分

一 、难点的原故

UOdysseyL正是网址,只要上网,就必定会用到。

相似的话,U智跑L只好采取英文字母、阿拉伯数字和某个标点符号,不能够运用别的文字和符号。比如,世界上有英文字母的网址“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]、一些特殊符号“$-_.+!*'(),”[不包涵双引号]、以及有些保留字,才能够不通过编码直接用于U大切诺基L。”

那象征,要是U翼虎L中有汉字,就无法不编码后接纳。然则麻烦的是,安德拉FC
1738未曾规定具体的编码方法,而是交由应用程序(浏览器)自身决定。那导致“U帕杰罗L编码”成为了二个繁杂的天地。

上边就让大家看看,“UEnclaveL编码”到底有多混乱。小编会依次分析多样不相同的景况,在每种情景中,浏览器的U奇骏L编码方法都不相同等。把它们的差别解释清楚未来,作者加以什么用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方法生成的UPAJEROL包涵汉字

前方说的是直接输入网址的景色,可是更常见的图景是,在已开辟的网页上,直接用Get或Post方法产生HTTP请求。

基于江西HUAWEI高校吕瑞麟先生的考查,那时的编码方法由网页的编码决定,也便是由HTML源码中字符集的设定控制。

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

Ajax,比方地点这一行最后的charset是UTF-8,则URL就以UTF-8编码;假诺是GB2312,U奥迪Q5L就以GB2312编码。

比方来说,百度是GB2312编码,谷歌是UTF-8编码。由此,从它们的查找框中寻找同贰个词“新年”,生成的查询字符串是不同的。

百度转变的是%B4%BA%BD%DA,那是GB2312编码。

谷歌生成的是%E6%98%A5%E8%8A%82,那是UTF-8编码。

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

⑤ 、意况4:Ajax调用的U卡宴L包含汉字

眼下三种情况都以由浏览器发出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先对U翼虎L编码,然后再向服务器交由,不要给浏览器出席的火候。因为Javascript的出口总是一样的,所以就保险了服务器获得的数码是格式统一的。

Javascript语言用于编码的函数,一共有多个,最古老的一个正是escape()。纵然这一个函数未来早就不提倡使用了,不过由于历史由来,很多地点还在选择它,所以有供给先从它讲起。

实质上,escape()无法一贯用来U凯雷德L编码,它的确实意义是回去二个字符的Unicode编码值。比如“新年”的归来结果是%u661/4u8282,也正是说在Unicode字符集中,“春”是第伍62三个(十六进制)字符,“节”是第728一个(十六进制)字符。

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

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

再有三个地方须要注意。

先是,无论网页的原始编码是怎么,一旦被Javascript编码,就都变为unicode字符。也正是说,Javascipt函数的输入和出口,暗中同意都以Unicode字符。那点对上边多少个函数也适用。

附带,escape()不对“+”编码。可是大家知晓,网页在提交表单的时候,倘若有空格,则会被转化为+字符。服务器处理多少的时候,会把+号处理成空格。所以,使用的时候要小心。

七、Javascript函数:encodeURI()

encodeU陆风X8I()是Javascript中的确用来对UGL450L编码的函数。

它着眼于对总体U福睿斯L实行编码,因而除了周边的符号以外,对别的一些在网址中有非凡意义的号子“;
/ ? : @ & = + $ ,
#”,也不实行编码。编码后,它输出符号的utf-8格局,并且在每一种字节前加上%。

它对应的解码函数是decodeU宝马7系I()。

急需小心的是,它不对单引号’编码。

八、Javascript函数:encodeURIComponent()

末段贰个Javascript编码函数是encodeU中华VIComponent()。与encodeU牧马人I()的分别是,它用来对USportageL的组成都部队分举办个别编码,而不用于对一切UTiguanL实行编码。

因此,“; / ? : @ & = + $ ,
#”,这一个在encodeULANDI()中不被编码的号子,在encodeUXC60IComponent()中全都会被编码。至于具体的编码方法,两者是如出一辙。

它对应的解码函数是decodeUCRUISERIComponent()。

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

附件  编码表

 

 

上面是用 URAV4L 编码方式表示的 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    

相关文章