IT日常- ASCII,Unicode 和UTF-8的前世今生

閱讀時間約 4 分鐘

前言

因之前業務上的介接踩到json開頭有Bom表標記符號的坑,想到之前也有遇到檔案內ASCII/Unicode/UTF-8編碼間轉換的坑,因此決定要來搞清楚這些編碼的前世今生與編碼原理了。畢竟字符編碼就是電腦技術中傳遞訊息的基石

行前複習

電腦能辨認的只有資訊就是2進位位元,

位元(bit): 0 / 1兩種狀態

位元組(byte) : 8位元(bit)

1 byte = 8 bit

各編碼的誕生

ASCII

全名是 American Standard Code for Information Interchange,譯成中文為美國資訊交換標準程式碼。當初的設計只用來滿足英語系國家因此只有用7位元(128種字元)來記錄每個字元的編碼,包含A-Z,a-z,0-9與一些保留字元與符號

白話文:美國為英語系國家編出一本收錄128字元的編碼字典

EASCII

如上述因ASCII編碼範圍只考慮到英語系國家導致沒有辦法滿足歐洲或拉丁語系國家使用的字元,因此再把ASCII擴編成8位元(256種字元)來擴充許多符號與希臘或拉丁符號使用

白話文:非英語系國家在ASCII的基礎上擴充屬於自己的語系字元(在128 => 255這段範圍中新增,因0-127一樣是繼承ASCII中的字元)


ASCII 的衍生問題

統一前的一Byte各表:

如上所介紹在非英語系國家中都會在編碼字典中(128 => 255這段範圍中新增自己語系字元)就會發生在法文語系中第150字元的符號在法文是某個字,在同一個第150字元的符號卻是希伯來文是另一個字,造成一Byte各表的狀況。

  • 生活中的案例

email或是某個檔案的內容可能發送方跟接收方使用不同語系,因此在讀檔案時用錯誤的編碼方式轉換就會出現亂碼等等


Unicode

為了解決以上所述一Byte各表的問題,需要一部收錄全部語系字元的編碼表(16進位制紀錄的字典),讓每個字元所代表的位元組都是獨一無二的。
於是Unicode就誕生了(簡稱萬國碼/國際碼),一部收錄全世界各字元符號的編碼對照表(字典)


Unicode的衍生問題

統一後的一Byte各表:

由於Unicode只記錄每個字元所對照的16進位值,但因電腦只看得懂0和1,所以我們需要將Unicode轉換為0和1的二元碼才能在電腦上運行。

當時沒有建立一套標準來表達所對照出來的16進位值要用甚麼方式表達成2進位制,因此就出現了以下幾個問題


  1. 如何區別Unicode 和ASCII如果一個字元的16進位值轉成2進位制時是3個Byte,電腦怎麼知道這3個Byte的值是表達成一個字元 還是 3個1 Byte的字元?
  2. 避免資料儲存的資源浪費如果表達的Byte要用固定長度表示,
    例:要固定用4Byte長度表示所以字元,但字母A只需要用1個Byte表示即可卻要多印左補3個Byte都是0來符合4個Byte長度的表示式這會造成儲存上的資源浪費


Unicode的轉換

Unicode定義了幾種轉換方式,也就是我們常聽到的Unicode Transformation Format(UTF)!   

UTF-8

UTF-8是一個可變長度的編碼,使用1到4個位元組(Byte)來表達一個字元,並能與ASCII相容。因為它可以判斷要以多少位元組來表示字元,所以UTF-8成為全世界最廣泛被使用的編碼方式。   


以下為UTF-8的表達規則     

1. 對於單字節(只需1Byte表達)的符號,位元組的第一位設為0,後面7位元為這個符號的Unicode碼。
因此對於英文字母,UTF-8 編碼和ASCII 碼是相同的。
例:下圖中序列一的表示法(紅框部分),字母x表示可用編碼的位元

raw-image


2. 對於n位元組的符號(n > 1),第一個位元組的前n位都設為1,第n + 1位元設為0,後面位元組的前兩位一律設為10。剩下x的位置,都是這個符號的Unicode碼可以填入的位置,填入的方向是從最後一個Byte位置開始由 右 => 左填入x,若還有x則 左補0填滿。   
例:下圖中序列2-4的表示法(紅框部分),字母x表示可放入該編碼的位元位置

raw-image

根據上面的範例來解讀就是:         

1. 若第1個Byte開頭是0的話代表這個字元是1個Byte就可以表達的。         

2. 若第1個Byte開頭是1的話就看有N個1就代表這個字元需要用N個Byte來表達   

其他實作方式

包括UTF-16(字元以兩個位元組或四個位元組表示)和UTF-32(字元用四個位元組表示),在此就不多做介紹。


結語

以上是近期對轉碼相關歷史緣由的統整,如有遇到相同疑問的讀者希望這篇對你有幫助,共勉之


參考資料

字嗨

字元編碼筆記:ASCII,Unicode 和UTF-8

2.3 電腦與人的溝通 - ASCII code, Unicode

code

數字系統換算器


6會員
17內容數
此篇教學 : 使用GitHub架設免費的部落格網站,搭上Hexo靜態模板,在主題頁面中尋找屬於自己的風格套版,輕鬆擁有自己的Blog外,加上留言板/SEO等設定在記錄生活同時也增進與讀者的互動頻率。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
何觀察00931B 統一20年期美債ETF,有收益平準金、發行價低。長債ETF熱滾滾?關於如何觀察00931B統一20年期美債ETF,那有收益平準金發行價低是它的特色。長債ETF熱滾滾,在市場上看起來是有熱度的存在那剛好這一檔呢最近發行啊,威利也看了一下它到底有什麼特色跟大家做分享。 大綱: 1.買債券目的 2.長短天期債券 3.債券殖利率倒掛
Thumbnail
avatar
威利財經生活隨筆
2023-11-13
河。床頭的夜燈被C開啟,但他並未入眠。 外頭沒雨,但他卻聽到水聲,時而潺潺時而洪大像十五歲那次夏日河畔的招靈。他輾轉翻身,搓揉雙腳、蜷伸軀幹,仍然睡不著。他知道他還醒著,就像這小鎮裡的每個人,做著白日裡未完的事。 小鎮某一處,J雙眼直瞪上方天花板的夜燈,雙臂擱在枕上時不時晃搖著腦袋。船隊的人永遠也不
Thumbnail
avatar
莫瑞
2023-10-04
和我一樣,你也喜歡Once嗎?瓦力喜歡散步,喜歡講話,講更多的話,幾乎就是全世界的寂寞一樣多的話。店長更喜歡那些喋喋不休的散步電影,像《愛在黎明破曉前》,像《安妮霍爾》,像《藍鳥情緣》,像音樂抒情小品《曾經,愛是唯一》。
Thumbnail
avatar
瓦力唱片行
2023-09-23
Ascii 0 在資料庫上造成的困擾如果你遇到資料查詢上怪怪的地方,可以來參考這篇文章...
avatar
陳楨珽
2023-08-18
一年年的春天,都是一種對珍惜生命的提醒; 大地回春,呈現生命的律動。 是否你已經洞悉了生命的奧秘
Thumbnail
avatar
Evelyn怡怡
2023-05-27
和身體一起寫作:確診後《 呼吸寫作》幫助我提升覺察與專注力的三個練習寫作和身體的關係是什麼?先前我未曾細想,之後卻發生了我不得不面對的狀況。二月的時候我確診了,目前已經恢復正常生活,只是仍有些症狀尚在恢復中。因為呼吸費力、容易咳嗽讓我時常處於一個疲倦的狀態,難以靜下心甚至很焦慮,要執筆寫作感覺比以往費力的多。正當我對於難以專注寫作感到焦慮、不知能做什麼的時候,
Thumbnail
avatar
自在生
2023-03-11
和過往聯繫在一起的自由之路:讀《怒濤》中的二二八有人說,只有「遺忘」,才能為自己和身邊的人們建立新的未來;但我說:只有傾聽、耐心、和誠懇,才能為我們的生活,帶來新的、同時也是延續自過往的未來。
Thumbnail
avatar
傅元罄
2023-02-27
和職業聲樂家與鋼琴家同住的福利|馬德里 Airbnb 在馬德里的一家 Airbnb上有住客寫下評論:「一見到他,就像一道光射過來。」我和說書人在手機上讀到這句,還一起笑了好久。入住那天,瘦高英俊、氣質高雅的 P 拉開大門迎接我們時,露出皓齒大大的微笑,陽光地說哈囉,我們才知道一點也不誇張
Thumbnail
avatar
喬安納
2022-12-24
Unicode(一):什麼是Unicode這篇筆記試著捕捉Unicode的一些基本概念(譬如什麼是UTF-8)。
Thumbnail
avatar
Josh Yao
2021-12-02
想勾勒妳如玉的容顏 以心為筆   情為彩 卻 描不出妳浮香田田 是妳的傲然漫了我的眼 還是我帶愁的淚 模糊了妳的美
Thumbnail
avatar
澄懷
2018-10-31