2014年11月15日 星期六

程式筆記:編碼概念初探




照例的曲文無關。

今天是把最近研究編碼的心得做一個紀錄。
網路上似乎沒有一個比較完整的概念,以下紀錄也可能有誤,請不吝指教。


在電腦的世界中,所有的一切都是由0與1組成的,包括字元、圖片、檔案,甚至軟體。

因此,當你看到了一個字(比方說)「早」,這個字在電腦裡面也是由0跟1所儲存起來的。

但是我們要怎麼定義「早」這個字的01組合值是多少呢?

為了解決這個問題,code page就出來了。

以Unicode為例,Unicode協會為「早」定義了一個數值,這個數值就叫code point。

「早」的code point以位元組(Byte)來顯示的話會像這個樣子:
0xE6, 0x97, 0xA9

請注意,這是以UTF-8的形式來表式,只有當你用UTF-8的時候,這組位元組(byte)才會對應到「早」這個字!


也就是說,你所看到的每個字的數值其實並不是固定的!

當你使用UTF-8,「早」的數值是 0xE6, 0x97, 0xA9

當你使用Big5,「早」的數值卻是 0xA6, 0xAD


「早」這個字只是個概念!

當你想要顯示出「早」這個字的時候,你就必須去查你的編碼表(code page),然後得知「早」這個字的數值是多少,電腦才有辦法依據編碼表(code page)把這組數值正確地翻譯成「早」。

只是這些工作電腦都幫你處理了,你只需要告訴電腦你要顯示的字就行了。


也因此才會有編碼問題,如果這裡有一份檔案,我們可以把這份檔案視為是一組數據,一組固定的數值。

假設這組數值是這個樣子:
0xE6, 0x97, 0xA9, 0xE5, 0xAE, 0x89

在UTF-8中會顯示出「早安」;在BIG5中卻會顯示「?拙?」

為什麼呢?

這是因為相同的數值,在不同的編碼表(code page)中對應到的字是不一樣的!


編碼的重要性即在於此,當你使用了UTF-8編出了一串數值,傳給對方卻顯示出了一堆亂碼,這是因為對方並非使用UTF-8來對應這一串數值!

你必須確定對方的編碼方式跟你一樣,你才能確保對方收到的不會是一堆亂碼!



接著稍微來說一下Base64這種編碼方式。

Base64是一種把二位元的資料用64個字元表示出來。
(並不是轉換後只有64個字元,而是以這64個字元去表示這組資料。)

基本上電腦上的所有東西都是一種二位元的資料,所以你可以把一張圖片透過Base64編碼成一組字串。

那這個東西有用在哪裡呢?

Base64編碼完成後的字串恰恰可以以ASCII表示(因為這64個字元都在ASCII裡面),也因此對於一些只限定用ASCII來進行傳輸的協定非常的有用。像是SMTP啦、SMTP啦跟SMTP。

至於Base64怎麼轉換的,網路上的相關資料非常的多,有興趣可自行尋找,這邊就不再多提。


參考資料:每個軟體開發者都絕對一定要會的Unicode及字元集必備知識


0 comments:

張貼留言