TextEncoder, TextDecoder(實驗中的功能)
base64 編解碼
Base64編碼作用:由于某些系統(tǒng)中只能使用ASCII字符。Base64就是用來將非ASCII字符的數(shù)據(jù)轉(zhuǎn)換成ASCII字符的一種方法。
base64特別適合在http,mime協(xié)議下快速傳輸數(shù)據(jù)。在前端通常用于圖片和icon的編碼,
escape/unescape(已廢棄 encodeURI替代)
針對寬字符做unicode編碼,并針對碼值做十六進制編碼,所以使用escape針對漢字編碼會得到形 如”\uxxxx”的結(jié)果;
該方法不會對 ASCII 字母和數(shù)字進行編碼,也不會對下面這些 ASCII 標(biāo)點符號進行編碼: * @ - _ + . / 。其他所有的字符都會被轉(zhuǎn)義序列替換;
document.write(escape("http://www.w3school.com.cn/") + "<br />")
document.write(escape("?!=()#%&"))
輸出:
http%3A//www.w3school.com.cn
%3F%21%3D%28%29%23%25%26
encodeURI()/decodeURI()
可把字符串作為 URI 進行編碼。( URI 中具有特殊含義的 ASCII 標(biāo)點符號,encodeURI() 函數(shù)是不會進行轉(zhuǎn)義,如:" ; , / ? : @ & = + $ # ")
該方法不會對 ASCII 字母和數(shù)字(A-Z a-z 0-9)進行編碼,也不會對這些 ASCII 標(biāo)點符號進行編碼,如: - _ . ! ~ * ' ( ) 。
應(yīng)用場景:期望獲取一個可用的URL地址時,使用此方法進行編碼。
document.write(encodeURI("http://www.w3school.com.cn/")+ "<br />")
document.write(encodeURI("http://www.w3school.com.cn/My first/"))
document.write(encodeURI(";,/?:@&=+$#"))
輸出:
http://www.w3school.com.cn/
http://www.w3school.com.cn/My%20first/
;,/?:@&=+$#
若使用 encodeURIComponent進行編碼,則無法得到一個可正常工作的鏈接??捎脤⒕幋a后的地址,粘貼到瀏覽器進行驗證。
encodeURIComponent("http://www.example.org/a file with spaces.html")
編碼結(jié)果
http%3A%2F%2Fwww.example.org%2Fa%20file%20with%20spaces.html
encodeURIComponent / decodeURIComponent
encodeURIComponent()是對統(tǒng)一資源標(biāo)識符(URI)的組成部分進行編碼的方法,而不用對整個URL進行編碼。
在 encodeURI() 中不被編碼的符號" ; , / ? : @ & = + $ # ",encodeURIComponent()都會進行編碼。(可以觀察到,都是一些常見的網(wǎng)絡(luò)協(xié)議標(biāo)志,如,“/@?&#'”)
該方法不會對 ASCII 字母和數(shù)字(A-Z a-z 0-9)進行編碼,也不會對這些 ASCII 標(biāo)點符號進行編碼: - _ . ! ~ * ' ( ) 。
提示和注釋
提示:請注意 encodeURIComponent() 函數(shù) 與 encodeURI() 函數(shù)的區(qū)別之處,前者假定它的參數(shù)是 URI 的一部分(比如協(xié)議、主機名、路徑或查詢字符串)。因此 encodeURIComponent() 函數(shù)將轉(zhuǎn)義用于分隔 URI 各個部分的標(biāo)點符號。
應(yīng)用場景:當(dāng)需要對URL的參數(shù)進行編碼時,使用encodeURIComponent()。
document.write(encodeURIComponent("http://www.w3school.com.cn/"))
document.write(encodeURIComponent("http://www.w3school.com.cn/p 1/"))
document.write(encodeURIComponent(",/?:@&=+$#"))
輸出:
http%3A%2F%2Fwww.w3school.com.cn
http%3A%2F%2Fwww.w3school.com.cn%2Fp%201%2F
%2C%2F%3F%3A%40%26%3D%2B%24%23
encodeURI與encodeURIComponent 不同點
1、對字符的編碼方式不同。可參考下圖

2、應(yīng)用場景不同
url里面的query 如果有類似username='a&foo=boo'這種,由于服務(wù)器根據(jù)&和=來識別query的key和value,就會產(chǎn)生歧義。
a&foo=boo需要被當(dāng)成一個整體,所以需要用encodeURI去轉(zhuǎn)義;
encodeURIComponent轉(zhuǎn)義范圍更大;
charCodeAt() / fromCharCode()
對字符進行 Unicode 編碼、解碼。
不足: 采用\uxxxx表示一個字符,其中xxxx表示字符碼點;但只限于\u0000—\uFFFF之間的字符,超出這個范圍的字符,將用2個雙字節(jié)形式表示;如:\uD824\uDFB7 表示“吉”;
如果\u后面是超過0xFFFF的數(shù)值(如:\u20BB7),JS將理解為\u20BB+7。返回值為“ 7”;
codePointAt() / fromCodePoint()
可識別32位的UTF-16字符;ES6只要將碼點放入大括號,就能正確解讀該字符串;如:\u{20BB7} 表示“吉”;
大括號表示法與4個字符的UTF-16等價:如:
\u{20BB7} === \uD842\uDFB7 // true
ES6的codePointAt,可以正確處理4個字節(jié)存儲的字符,返回一個字符碼點;
codePointAt返回的碼點是十進制值,要轉(zhuǎn)成16進制,可用toString方法;
如:s.codePointAt(0).toString(16);
應(yīng)用: 判斷一個字符是由2個字節(jié)還是4個字節(jié)組成;
function is32Bit(c){
return c.codePointAt(0) > 0xFFFF;
}
is32Bit('吉') // true
is32Bit('a') // false