照例的曲文無關。
今天是把最近研究編碼的心得做一個紀錄。
網路上似乎沒有一個比較完整的概念,以下紀錄也可能有誤,請不吝指教。
在電腦的世界中,所有的一切都是由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來進行傳輸的協定非常的有用。
至於Base64怎麼轉換的,網路上的相關資料非常的多,有興趣可自行尋找,這邊就不再多提。
參考資料:每個軟體開發者都絕對一定要會的Unicode及字元集必備知識
0 comments:
張貼留言