摘要:字符集編碼就是對(duì)字符根據(jù)不同字符集中對(duì)應(yīng)的格式進(jìn)行編碼解碼,這個(gè)大家都好理解。下面詳細(xì)說說,以編碼解碼和編碼解碼為例。
《來自羅志曉的筆記:http://note.youdao.com/notesh...》
我們平時(shí)老說的編碼解碼,很多人都只知道 字符集編碼解碼。其實(shí)除了字符集編碼解碼,常見的還有另一類,如 Url編碼解碼、Base64編碼解碼。
這兩類編碼的原理是完全不一樣的,如果沒有了解到這個(gè)分類以為編碼都是字符集編碼,那么你會(huì)無法理解那些解釋編碼的博文,會(huì)疑問:怎么說的都不一樣啊,久之真的會(huì)懷疑人生。可恨的是,很多博文在關(guān)鍵環(huán)節(jié)上 對(duì)這兩個(gè)概念 都是統(tǒng)一用 “編碼解碼” 四字一筆帶過。
字符集編碼: 就是對(duì)字符 根據(jù)不同字符集中對(duì)應(yīng)的格式 進(jìn)行編碼解碼,這個(gè)大家都好理解。
而另一類別編碼解碼出現(xiàn)的意義并不是 為在不同字符集之間對(duì)字符進(jìn)行格式轉(zhuǎn)換,而是為了別的原因,例如:將不安全字符轉(zhuǎn)化、原內(nèi)容不可見以提高安全性、和 便于網(wǎng)絡(luò)傳輸。
下面詳細(xì)說說,以Base64編碼解碼 和 Url 編碼解碼為例。
生活中的場(chǎng)景:
我們平時(shí)接收發(fā)送郵件所使用的SMTP協(xié)議,是基于文本的協(xié)議,也就是說只能處理常見字符。可是我們?yōu)楹芜€可以發(fā)送接收?qǐng)D片、視頻、壓縮包等二進(jìn)制文件?這就是Base64編碼解碼 出現(xiàn)的意義了。我們發(fā)送郵件前,客戶端會(huì)將 圖片等進(jìn)行Base64編碼,于是整張圖片變成了 人類可讀的常見字符,然后在發(fā)送出去。接收方客戶端接收到后,再 Base64解碼還原成圖片呈現(xiàn)給我們。
原理過程:
簡(jiǎn)單來說,Base64就是一種用 64個(gè)Ascii字符來表示任意二進(jìn)制數(shù)據(jù)的方法,或者簡(jiǎn)單的說將二進(jìn)制數(shù)據(jù)編碼成Ascii字符。
這 64個(gè)Ascii字符如下:
即ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
一眼看去就知道是26個(gè)字母大小寫和數(shù)字和+/ 。
沒錯(cuò),別驚訝,你沒理解錯(cuò),上面的64個(gè)字符真的可以表示任意的二進(jìn)制文件數(shù)據(jù)。那么是怎么操作的呢?過程如下:
以3個(gè)字節(jié)為一組(24位),按每6位高位補(bǔ)0擴(kuò)展成8位得到4個(gè)字節(jié)(32位)。
(一)圖片舉例
假如一張圖片只有四個(gè)字節(jié):11101111 11011011 11101111 11011011
以3個(gè)字節(jié)為一組:(剩余的字節(jié)不足3個(gè)字節(jié)的話則補(bǔ)0湊夠) 11101111 11011011 11101111 11011011 00000000 00000000
每組 按 6bit 劃分成 4小分組 111011 111101 101111 101111 110110 110000 000000 000000
每個(gè)小分組高位補(bǔ)0 以湊夠 8bit,即一個(gè)字節(jié) 00111011 00111101 00101111 00101111 00110110 00110000 00000000 00000000
[這里你可能會(huì)容易認(rèn)為:每個(gè)新的字節(jié) 映射 到一個(gè)Ascii字符集中的字符,然而你又錯(cuò)了!]
上述的每個(gè)新的字節(jié) 其實(shí)是 上表格的字符集合的索引下標(biāo)(位置序號(hào))而已,并非映射到原生Ascii字符集。如下圖,我們將新的字節(jié)用 十進(jìn)制 展示:
根據(jù)索引做轉(zhuǎn)換:[這里注意:凡是后面補(bǔ)0 的字節(jié),只能算映射到 = ]
59 ---> 7 61---> 947---> v 47---> v 54---> 2 48--->w 0---> = 0---> =
即:
因此最后這張圖片變成:79vv2w== ,即Ascii字符,這樣就可以符合SMTP文本協(xié)議了。
(二)字符舉例
圖片的話,我們是著眼其 字節(jié) 的 。字符也是如此。首先我們要 根據(jù)字符集 找出字符對(duì)應(yīng)的二進(jìn)制字節(jié),然后按照上面的過程編碼。下面 以“你a”為例
UTF-8
‘你’ : `0xE4BDA0` 即 `111001001011110111000000` ‘a(chǎn)’ : `0x61` 即`01100001` 合起來就是: `11100100101111011100000001100001` 計(jì)算后得到結(jié)果: `5L2gYQ==`
GBK
‘你’ : `0xC4E3` 即 `1100010011100011` ‘a(chǎn)’ : `0x61`即 `01100001` 合起來就是:`110001001110001101100001` 計(jì)算后得到結(jié)果就和上面不一樣了。
Tips:
其實(shí)網(wǎng)上好多Base64在線編碼器,如工具網(wǎng)址:http://www.qqxiuzi.cn/bianma/...我們可以很方便地Base64編碼:【注意:在網(wǎng)頁上輸入框輸入的字符都是 根據(jù) 響應(yīng)頭中的ContentType指定的字符集編碼進(jìn)行編碼的】
Base64編碼的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):可以將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成可打印Ascii字符,方便傳輸數(shù)據(jù);對(duì)數(shù)據(jù)進(jìn)行簡(jiǎn)單的加密,肉眼不可識(shí)別。
缺點(diǎn):內(nèi)容編碼后的體積會(huì)變大,編碼和解碼需要額外的工作量。
常見運(yùn)用場(chǎng)景:(來自網(wǎng)絡(luò))
將圖片等資源文件以Base64編碼形式直接放于代碼中,使用的時(shí)候反Base64后轉(zhuǎn)換成Image對(duì)象使用;
有些文本協(xié)議不支持不可見字符的傳遞,只能轉(zhuǎn)換成可見字符來傳遞信息;
有時(shí)在一些特殊的場(chǎng)合,大多數(shù)消息是純文本的,偶爾需要用這條純文本通道傳一張圖片之類的情況發(fā)生的時(shí)候,就會(huì)用到Base64。
注意:
Base64 不是什么實(shí)質(zhì)意義上的加解密算法,不過的確可以將 原內(nèi)容 ”改頭換面“,人們往往將這理解成 加密 了。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/67439.html
摘要:中國(guó)人民看到這樣很不錯(cuò),于是就把這種漢字方案叫做。結(jié)果擴(kuò)展之后的編碼方案被稱為標(biāo)準(zhǔn),包括了的所有內(nèi)容,同時(shí)又增加了近個(gè)新的漢字包括繁體字和符號(hào)。 聲明:文章借鑒自【徹底搞懂 python 中文亂碼問題】 一. 各種編碼的由來 1.1 ASCII編碼 很久很久以前,有一群人,他們決定用8個(gè)可以開合的晶體管來組合成不同的狀態(tài),以表示世界上的萬物。他們看到8個(gè)開關(guān)狀態(tài)是好的,于是他們把這稱為...
摘要:文章首發(fā)地址深入分析中的中文編碼問題背景編碼問題一直困擾著程序開發(fā)人員,尤其是在中更加明顯,因?yàn)槭强缙脚_(tái)的語言,在不同平臺(tái)的編碼之間的切換較多。 文章首發(fā)地址:深入分析 Java Web 中的中文編碼問題 背景: 編碼問題一直困擾著程序開發(fā)人員,尤其是在 Java 中更加明顯,因?yàn)?Java 是跨平臺(tái)的語言,在不同平臺(tái)的編碼之間的切換較多。接下來將介紹 Java 編碼問題出現(xiàn)的根本原...
摘要:經(jīng)常有讀者在公眾號(hào)上問亂碼的問題,昨天又有一個(gè)小伙伴問及此事,其實(shí)這個(gè)問題很簡(jiǎn)單,但是想要說清楚卻并不容易,因?yàn)槊總€(gè)人亂碼的原因都不一樣,給每位小伙伴都把亂碼的原因講一遍也挺費(fèi)時(shí)間的,因此,松哥今天決定寫一篇文章,和大伙好好捋捋中的亂碼問題 經(jīng)常有讀者在公眾號(hào)上問 JavaWeb 亂碼的問題,昨天又有一個(gè)小伙伴問及此事,其實(shí)這個(gè)問題很簡(jiǎn)單,但是想要說清楚卻并不容易,因?yàn)槊總€(gè)人亂碼的原因...
摘要:為了消除文件格式和字符編碼的疑惑,上網(wǎng)搜索并翻出以前收藏的文章,心結(jié)總算了卻。本文即是對(duì)文件和字符編碼的個(gè)人總結(jié)。雙字節(jié)多字節(jié)字符,編碼方式和字節(jié)序,才是困擾程序員的問題。使用兩個(gè)字節(jié)表示一個(gè)字符,平臺(tái)默認(rèn)的字符編碼方案都是。 轉(zhuǎn)載請(qǐng)注明來源:https://tlanyan.me/ascii-bina... 近期對(duì)識(shí)別文件格式感到好奇,不幸和字符編碼搞混,不明其中原理導(dǎo)致心煩意亂。為...
閱讀 3021·2021-11-24 10:32
閱讀 678·2021-11-24 10:19
閱讀 5071·2021-08-11 11:17
閱讀 1456·2019-08-26 13:31
閱讀 1259·2019-08-23 15:15
閱讀 2287·2019-08-23 14:46
閱讀 2265·2019-08-23 14:07
閱讀 1074·2019-08-23 14:03