日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
JavaScript:詳解Base64編碼和解碼

Base64是最常用的編碼之一,比如開發(fā)中用于傳遞參數(shù)、現(xiàn)代瀏覽器中的標(biāo)簽直接通過Base64字符串來渲染圖片以及用于郵件中等等。Base64編碼在RFC2045中定義,它被定義為:Base64內(nèi)容傳送編碼被設(shè)計(jì)用來把任意序列的8位字節(jié)描述為一種不易被人直接識(shí)別的形式。

創(chuàng)新互聯(lián)專注于企業(yè)全網(wǎng)整合營(yíng)銷推廣、網(wǎng)站重做改版、蓋州網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5頁(yè)面制作、購(gòu)物商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為蓋州等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

我們知道,任何數(shù)據(jù)在計(jì)算機(jī)中都是以二進(jìn)制的方式存儲(chǔ)的。一個(gè)字節(jié)為8位,一個(gè)字符在計(jì)算機(jī)中存儲(chǔ)為一個(gè)或多個(gè)字節(jié),比如英文字母、數(shù)字以及英文標(biāo)點(diǎn)符號(hào)就是用一個(gè) 字節(jié)來存儲(chǔ)的,通常稱為ASCII碼。而簡(jiǎn)體中文、繁體中文、日文以及韓文等都是用多字節(jié)來存儲(chǔ)的,通常稱為多字節(jié)字符。因?yàn)锽ase64編碼是對(duì)字符串的編碼表示進(jìn)行處理的,不同編碼的字符串的Base64的結(jié)果是不同的,所以我們需要了解基本的字符編碼知識(shí)。

字符編碼基礎(chǔ)

計(jì)算機(jī)最開始只支持ASCII碼,一個(gè)字符用一個(gè)字節(jié)表示,只用了低7位,***位為0,因此總共有128個(gè)ASCII碼,范圍為0~127。后來為了支持多種地區(qū)的語言,各大組織機(jī)構(gòu)和IT廠商開始發(fā)明它們自己的編碼方案,以便彌補(bǔ)ASCII編碼的不足,如GB2312編碼、GBK編碼和Big5編碼等。但這些編碼都只是針對(duì)局部地區(qū)或少數(shù)語言文字,沒有辦法表達(dá)所有的語言文字。而且這些不同的編碼之間并沒有任何聯(lián)系,它們之間的轉(zhuǎn)換需要通過查表來實(shí)現(xiàn)。

為了提高計(jì)算機(jī)的信息處理和交換功能,使得世界各國(guó)的文字都能在計(jì)算機(jī)中處理,從1984年起,ISO組織就開始研究制定一個(gè)全新的標(biāo)準(zhǔn):通用多八位(即多字節(jié))編碼字符集(Universal Multiple-Octet Coded Character Set),簡(jiǎn)稱UCS。標(biāo)準(zhǔn)的編號(hào)為:ISO 10646。這一標(biāo)準(zhǔn)為世界各種主要語言的字符(包括簡(jiǎn)體及繁體的中文字)及附加符號(hào),編制統(tǒng)一的內(nèi)碼。

統(tǒng)一碼(Unicode)是Universal Code的縮寫,是由另一個(gè)叫“Unicode學(xué)術(shù)學(xué)會(huì)”(The Unicode Consortium)的機(jī)構(gòu)制定的字符編碼系統(tǒng)。Unicode與ISO 10646國(guó)際編碼標(biāo)準(zhǔn)從內(nèi)容上來說是同步一致的。具體可參考:Unicode 。

ANSI

ANSI不代表具體的編碼,它是指本地編碼。比如在簡(jiǎn)體版windows上它表示GB2312編碼,在繁體版windows上它表示Big5編碼,在日文操作系統(tǒng)上它表示JIS編碼。所以如果您新建了個(gè)文本文件并保存為ANSI編碼,那么您現(xiàn)在應(yīng)該知道這個(gè)文件的編碼為本地編碼。

Unicode

Unicode編碼是和字符表一一映射的。比如56DE代表漢字'回',這種映射關(guān)系是固定不變的。通俗的說Unicode編碼就是字符表的坐標(biāo),通過56DE就能找到漢字'回'。Unicode編碼的實(shí)現(xiàn)包括UTF8、UTF16、UTF32等等。

Unicode本身定義的就是每個(gè)字符的數(shù)值,是字符和自然數(shù)的映射關(guān)系,而UTF-8或者UTF-16甚至UTF-32則定義了如何在字節(jié)流中斷字,是計(jì)算機(jī)領(lǐng)域的概念。

通過上圖我們知道,UTF-8編碼為變長(zhǎng)的編碼方式,占1~6個(gè)字節(jié),可通過Unicode編碼值的區(qū)間來判斷,并且每個(gè)組成UTF8字符的字節(jié)都是有規(guī)律可循的。本文只討論UTF8和UTF16這兩種編碼。

UTF16

UTF16編碼使用固定的2個(gè)字節(jié)來存儲(chǔ)。因?yàn)槭嵌嘧止?jié)存儲(chǔ),所以它的存儲(chǔ)方式分為2種:大端序和小端序。UTF16編碼是Unicode最直接的實(shí)現(xiàn)方式,通常我們?cè)趙indows上新建文本文件后保存為Unicode編碼,其實(shí)就是保存為UTF16編碼。UTF16編碼在windows上采用小端序的方式存儲(chǔ),以下我新建了個(gè)文本文件并保存為Unicode編碼來測(cè)試,文件中只輸入了一個(gè)漢字'回',之后我用Editplus打開它,切換到十六進(jìn)制方式查看,如圖所示:

我們看到有4個(gè)字節(jié),前2個(gè)字節(jié)FF FE是文件頭,表示這是一個(gè)UTF16編碼的文件,而DE 56則是'回'的UTF16編碼的十六進(jìn)制。我們經(jīng)常使用的JavaScript語言,它內(nèi)部就是采用UTF16編碼,并且它的存儲(chǔ)方式為大端序,來看一個(gè)例子:

 
 

很明顯跟剛才Editplus顯示的不一樣,順序是相反的,這是因?yàn)樽止?jié)序不一樣。具體可參考:UTF-16 。

UTF8

UTF8是采用變長(zhǎng)的編碼方式,為1~6個(gè)字節(jié),但通常我們只把它看作單字節(jié)或三字節(jié)的實(shí)現(xiàn),因?yàn)槠渌闆r實(shí)在少見。UTF8編碼通過多個(gè)字節(jié)組合的方式來顯示,這是計(jì)算機(jī)處理UTF8的機(jī)制,它是無字節(jié)序之分的,并且每個(gè)字節(jié)都非常有規(guī)律,詳見上圖,在此不再詳述。

UTF16和UTF8的相互轉(zhuǎn)換

 

UTF16轉(zhuǎn)UTF8

UTF16和UTF8之間的相互轉(zhuǎn)換可以通過上圖的轉(zhuǎn)換表來實(shí)現(xiàn),判斷Unicode碼所在的區(qū)間就可以得到這個(gè)字符是由幾個(gè)字節(jié)所組成,之后通過移位來實(shí)現(xiàn)。我們用漢字'回'來舉一個(gè)轉(zhuǎn)換的例子。

我們已經(jīng)知道漢字'回'的Unicode碼是0x56DE,它介于U+00000800 – U+0000FFFF之間,所以它是用三個(gè)字節(jié)來表示的。

所以我們需要將0x56DE這個(gè)雙字節(jié)的值變?yōu)槿止?jié)的值,注意上圖中的x部分,就是對(duì)應(yīng)0x56DE的各位字節(jié),如果您數(shù)一下x的個(gè)數(shù),會(huì)發(fā)現(xiàn)剛好是16位。

轉(zhuǎn)換思路

從0x56DE中取出4位放在低位,并和二進(jìn)制的1110結(jié)合,這就是***個(gè)字節(jié)。從0x56DE中剩下的字節(jié)中取出6位放在低位,并和二進(jìn)制的10結(jié)合,這就是第二個(gè)字節(jié)。第三個(gè)字節(jié)依照類似的方式實(shí)現(xiàn)。

代碼實(shí)現(xiàn)

為了讓大家更好的理解,以下代碼只是實(shí)現(xiàn)漢字'回'的轉(zhuǎn)換,代碼如下:

 
 

輸出的結(jié)果看起來像亂碼,這是因?yàn)镴avaScript不知道如何顯示UTF8的字符。您或許會(huì)說輸出不正常轉(zhuǎn)換還有什么用,但您應(yīng)該知道轉(zhuǎn)換的目的還經(jīng)常用于傳輸或API的需要。

UTF8轉(zhuǎn)UTF16

這是UTF16轉(zhuǎn)換到UTF8的逆轉(zhuǎn)換,同樣需要對(duì)照轉(zhuǎn)換表來實(shí)現(xiàn)。還是接上一個(gè)例子,我們已經(jīng)得到了漢字'回'的UTF8編碼,這是三個(gè)字節(jié)的,我們只需要按照轉(zhuǎn)換表來轉(zhuǎn)成雙字節(jié)的,如圖所示,我們需要保留下所有的x。

代碼如下:

 
 

知道了轉(zhuǎn)換規(guī)則,就很容易實(shí)現(xiàn)了。

Base64編碼

Base64編碼要求把3個(gè)8位字節(jié)(3*8=24)轉(zhuǎn)化為4個(gè)6位的字節(jié)(4*6=24),之后在6位的前面補(bǔ)兩個(gè)0,形成8位一個(gè)字節(jié)的形式。由于2的6次方為64,所以每6個(gè)位為一個(gè)單元,對(duì)應(yīng)某個(gè)可打印字符。當(dāng)原數(shù)據(jù)不是3的整數(shù)倍時(shí),如果***剩下兩個(gè)輸入數(shù)據(jù),在編碼結(jié)果后加1個(gè)“=;如果***剩下一個(gè)輸入數(shù)據(jù),編碼結(jié)果后加2個(gè)“=;如果沒有剩下任何數(shù)據(jù),就什么都不要加,這樣才可以保證資料還原的正確性。

轉(zhuǎn)碼對(duì)照表

每6個(gè)單元高位補(bǔ)2個(gè)零形成的字節(jié)位于0~63之間,通過在轉(zhuǎn)碼表中查找對(duì)應(yīng)的可打印字符?!?”用于填充。如下圖所示為轉(zhuǎn)碼表。

具體可參考: Base64 。

#p#

Base64解碼

解碼是編碼的逆過程,先看后面補(bǔ)了幾個(gè)“=”號(hào),最多只可能補(bǔ)2個(gè)“=”號(hào)。一個(gè)“=”相當(dāng)于補(bǔ)了2個(gè)0,所以去掉后面補(bǔ)的0后,再按8位展開,即可還原。

JavaScript實(shí)現(xiàn)Base64的編碼和解碼

之前已經(jīng)詳細(xì)講解了整個(gè)過程,本文的例子都是采用UTF8編碼的字符串作為Base64編碼的基礎(chǔ)。因?yàn)镴avaScript內(nèi)部是使用Unicode編碼,所以需要有個(gè)轉(zhuǎn)換過程,原理之前也詳細(xì)講解過并給出了示例,以下是代碼實(shí)現(xiàn):

 
 

不得不說,在JavaScript中實(shí)現(xiàn)確實(shí)很麻煩。我們來看下PHP對(duì)同樣的字符串編碼的結(jié)果:

因?yàn)樽址幋a是一樣的,所以結(jié)果也一樣。


分享題目:JavaScript:詳解Base64編碼和解碼
文章起源:http://www.dlmjj.cn/article/dpihhds.html