电竞比分网-中国电竞赛事及体育赛事平台

分享

對于編碼和解碼的概念,你只需要看此文就夠了

 我愛你文摘 2019-01-03
在軟件開發(fā)中,有很多地方都可能涉及到編碼解碼而不同類型的編碼和解碼在不同場景中意義不同,有的時候我們稱字符編碼解碼、或者是為url編碼解碼、又或者是html編碼解碼本文將對上面提到的三種編碼解碼簡單說明

編碼解碼簡介

所謂編碼,即將一種格式的數(shù)據(jù)轉(zhuǎn)換成另一種格式

對于編碼和解碼的概念,你只需要看此文就夠了

所謂解碼,即將編碼后的數(shù)據(jù)還原成原始格式

對于編碼和解碼的概念,你只需要看此文就夠了

字符編碼解碼

為什么要對字符進(jìn)行編碼?

因為在計算機(jī)中,不能存儲字符,只能存儲0和1兩個數(shù)字。因此,無論什么字符,都必須轉(zhuǎn)換為使用0和1表示的數(shù)字后才能存儲到計算機(jī)。

而把字符通過某種規(guī)則,轉(zhuǎn)換成數(shù)字,就是字符編碼。

字符編碼的規(guī)則只有一種嗎?

不是的,字符編碼的規(guī)則很多,比如:ASCII、unicode、utf-8、gbk、big5等等等等。

同一個字符,用不同的規(guī)則進(jìn)行編碼后,得到的數(shù)字可能有差異。

每一種字符編碼是不是都能涵蓋所有的字符?

不是的,比如ASCII編碼,只支持所有的英文字母、英文符號和數(shù)字。其他的字符它無法對其進(jìn)行編碼;而gbk編碼對簡體中文支持良好,但對一些其他國家的文字就不行了

對一個字符,如果使用一種編碼方式編碼,但使用另一種方式解碼,會怎么樣呢?

會發(fā)生亂碼的情況。在解碼時,應(yīng)該使用對應(yīng)編碼的解碼方式才能還原最終的結(jié)果。

比如一個“我”字,使用unicode進(jìn)行編碼保存,但使用big5的方式解碼,則會得到亂碼。以后在PHP的文件處理章節(jié)中會詳細(xì)說明

url編碼解碼

為什么需要對url地址進(jìn)行編碼解碼?

在http協(xié)議中,對url地址部分,僅支持ASCII編碼,也就是說,在url地址中只能存在英文字符、英文字母、數(shù)字。如果出現(xiàn)其他的字符,http無法識別。

那如果要在url中放入其他字符怎么辦呢?就需要按照某種規(guī)則,將這些特殊的字符轉(zhuǎn)換成另一種被ASCII編碼支持的字符

url地址的編碼和解碼有哪些規(guī)則?

url地址的編碼規(guī)則,使用的是,由國際標(biāo)準(zhǔn)組織(ISO),在2005年發(fā)布的RFC3986“%編碼”規(guī)范。

絕大部分瀏覽器都支持這樣的規(guī)范

RFC3986“%編碼”規(guī)范具體是什么內(nèi)容

簡單的說,就是把一個字符,使用某種字符編碼得到它的十六進(jìn)制表示格式,然后在每兩段十六進(jìn)制前面使用%

舉個例子,比如,對“我”使用url編碼,那么具體的流程如下:

  1. 對“我”這個字符進(jìn)行utf-8編碼,得到一個數(shù)字:15108241
  2. 對其數(shù)字使用十六進(jìn)制表示:E68891
  3. 在每兩段十六進(jìn)制前面加上百分號:%E6%88%91
  4. %E6%88%91就是最終的編碼結(jié)果

再舉個例子,比如對url中的保留字&進(jìn)行編碼:

  1. 對“&”這個字符進(jìn)行utf-8編碼,得到一個數(shù)字:38
  2. 對其數(shù)字使用十六進(jìn)制表示:26
  3. 在每兩段十六進(jìn)制前面加上百分號:%26
  4. %26就是最終的編碼結(jié)果

對所有字符都可以使用url編碼嗎?

不是的,url編碼只是為了解決非ASCII字符和保留字問題,如果字符本身就是一個ASCII字符或保留字,則使用url編碼不會發(fā)生任何變化

比如,如果你對“a”這個字符使用url編碼,得到的結(jié)果還是“a”,因為“a”本身就是一個ASCII字符,并且它也不是url地址中的保留字,所有不會對其進(jìn)行編碼

在對url地址中某些數(shù)據(jù)進(jìn)行編碼時,一定會使用utf-8編碼嗎?

在大部分情況下是這樣,這是由瀏覽器開發(fā)商自行設(shè)定的規(guī)則,不同的瀏覽器使用哪種字符編碼來處理url,里面有很多的細(xì)節(jié),目前不必深究。你可以認(rèn)為就是使用utf-8編碼即可。

在需要編碼時,我是要對整個url進(jìn)行編碼嗎?

不對!

比如,要訪問這樣的地址:http://localhost/index.php?d=新聞

在這個地址中,只需要編碼新聞即可,如果你對整個url地址進(jìn)行編碼,則會得到以下的結(jié)果:

http%3A%2F%2Flocalhost%2Findex.php%3Fd%3D%E6%96%B0%E9%97%BB

上面深色的部分,是對地址中的保留字編碼的結(jié)果,而這樣的地址不是一個有效的url格式,無法訪問。

總之,在處理url編碼時,僅需要對用戶數(shù)據(jù)部分進(jìn)行編碼,而解碼時也是對用戶數(shù)據(jù)進(jìn)行解碼

html編碼解碼

什么是html編碼解碼?

就是對html中一些特殊字符使用另一種形式表示,我們通常把編碼后的形式,叫做html實體字符

比如:

  • <>
  • >被html編碼后:>

為什么需要html編碼呢?

如果你想在頁面上顯示:

,你不可以直接把

直接寫到html源碼中,因為你這樣做,會被瀏覽器認(rèn)為是一個標(biāo)簽,而不是一個普通的

字符

所以,你就需要對

進(jìn)行html編碼,把里面的特殊字符轉(zhuǎn)換成html實體后,得到:

,這樣就可以在頁面上顯示出

了。

在PHP中如何進(jìn)行html編碼呢?

php提供了兩個函數(shù)分別用于html的編碼和解碼:

echo '

hello

'; //不編碼輸出echo htmlspecialchars('

hello

'); //輸出html編碼后的結(jié)果echo htmlspecialchars_decode('

hello

');//輸出html解碼后的結(jié)果

最終輸出:

hello

hello

hello

這樣的結(jié)果發(fā)送給瀏覽器后,瀏覽器顯示:

對于編碼和解碼的概念,你只需要看此文就夠了

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多