電腦編碼系統介紹:
--------------------------------------------------------
(一)基礎概念
(二)常見的編碼及說明
(三)網際網路的發展
(四)Unicode
--------------------------------------------------------
(一)基礎概念:
(一)基礎概念
(二)常見的編碼及說明
(三)網際網路的發展
(四)Unicode
--------------------------------------------------------
(一)基礎概念:
由於人能理解各種特殊複雜的文字及符號,而電腦只懂得兩個數字,即0與1,因此我們必須制定一些規則,將特殊複雜的文字及符號,用0與1的數字組合表示。
如大寫英文字母”A”,在ASCII編碼中,”1000001”(7bits)表示。”1000001”稱為字元集、字符集(Character encoding)。
所以字元編碼是一種系統,會將支援的字元集中的每一個字元的與代表該字元的某個值配對。
PS:Bit(位元)為最小單位:0或1。Bytes(位元組)由八個Bit所組成。
1. ASCII(American Standard Code for Information Interchange):
(1) 美國資訊交換標準碼,字面意思就知此編碼由美國制定,為基於拉丁字母的一套字元邏輯,ASCII編碼僅用7bits,最多僅能表示27,128個字元,所以能展現的字元極其有限,只能表達英文字母A-Z、a-z、數字0-9及少量標點符號,適合用於開發英文環境中。
(2) 每台電腦都有此編碼,用來儲存英文字元素。其他語言國家透過相同的ANSI編碼,去做自己國家的語言文字對應,因而產生不同的編碼系統。若是用同樣文字轉換成別的編碼辨識,會形成亂碼。(以2個Bytes-16bits對應一個文字進行儲存)
2. EASCII(Extended American Statndard Code for Information Interchange):
(1) ASCII編碼對於英語系國家是足夠使用的,但歐洲許多國家不能用純英文的編碼來表示字元,例如a上面加一個圈、希臘符號等等都無法使用ASCII來呈現字元,為了解決此問題,而發展出了Extended ASCII。
(2) 如同其名,是ASCII的延伸版,EASCII使用8bits來編碼,比ASCII多1個bit,能表示256個字元,雖然多了128個字元但還是無法容納整個歐洲國家的文字,編碼表需要因地制宜,故EASCII依然會依照國家不同,而有不同的字元編碼,不同地區的編碼仍舊無法統一。
3. ISO/IEC 8859(簡稱ISO 8859):此時為了歐洲國家統一使用字元標準,國際標準組織(ISO)與國際電工委員會(IEC)出來一起訂製EASCII編碼的標準。有ISO/IEC 8859-1 ~ 16多種符號集,最廣泛被運用的是ISO/IEC 8859-1,256個字元主要涵蓋了西歐文字,而歐洲與北美一直都是電腦科學發展的重心,故間接加速使用ISO8859-1的接受度。
4. Windows-1252:係由微軟制定的字元編碼(或稱為CP-1252),這套編碼標準大部分遵守ISO 8859-1編碼方式,但仍有小部分有其落差,例如雙引號跟撇號,在非windows操作系統都變成問號或方格。Windows-1252被用於英文與西歐版本的Windows系統,成為目前常見的編碼之一。
5. BIG5:
(1) 中文碼分成兩類:Big5-1984、Big5-2003。(交換碼:CNS 11643)
(2) Big5-1984版:1984年資策會為了五大中文套裝軟體設計,包含文書處理、資料庫、試算表、通訊及繪圖,發展出的編碼方式。採用雙位元組,高、低位元組。
(3) Big5-2003版:2003年加入官方的CNS 11643附錄,成為官方標準。額外加上3954個字,共有17005個字。
(4) 常用的繁體中文編碼,由兩個位元組(2Bytes)表示一個字元,第一個位元組稱為高位位元組,第二個位元組稱為低位位元組。
(5) 又稱為大五碼或五大碼,為1983年台灣資策會為當時所開發的”五大中文套裝軟體”所制定的中文內碼,為正體中文社群(台港澳)中常見的編碼。
(6) 相容於ASCII,也就是同一個英文字母的編碼在ASCII與BIG5是一樣的。
※CNS 11643:中文標準交換碼,是我國為資訊交換而制定的標準字元編碼規則,ISO認證通過。作為各種中文內碼轉換的媒介。
6. Shift_JIS:是日本電腦系統常用的編碼表,能容納全形及半形拉丁字母、平假名、片假名、符號及日語漢字。
7. CJK編碼:約同一時期,亞洲區的編碼同樣混亂,中文、日文、印度文、越語…各個國家有自己的編碼系統。而亞洲語言的字元太多,光是中文常用字可能就有上千字,僅用1Byte=8bits=256個字元無法完全表達,故亞洲文字通常需要兩個以上的Byte來表示,因此亞洲體系又較歐美體系的編碼方式更為複雜。
1. 成熟前:在網際網路沒有發達的年代中,不同地區使用不同的編碼,甚至同一個國家內有時也沒有統一的編碼。在當時非大問題,當時只要彼此相連的電腦位置很相近,要連線的兩方只要互相講好要使用的編碼就沒問題。
2. 成熟後:隨著Internet的發展,全球的電腦皆可互相交換訊息,亞洲客戶可透過網路連上歐洲伺服器,此時如果從亞洲電腦輸入的字串在歐洲電腦不能正確顯示,那麼雙方的使用者會有很大困擾。此時,因地制宜的區域編碼就無法解決這個問題,為了在網際網路上流通資訊,必須逐漸捨棄舊有編碼方式,並建立一套新的機制,此時發展Unicode編碼方式。
Unicode的儲存方式,不同系統平台的設計,會有不同的儲存方式,儲存方式稱為Unicode轉換格式(UTF)。
1. UTF-8:
(1) Unicode萬國碼,為了解決傳統的字元編碼字元,無法在不同國家中使用而產生的,為了能夠在同一段文字,利用同一個編碼去呈現不同國家的語言,發展出Unicode的通用編碼,主要將全世界語言文字都收錄,Unicode有兩大類。
l UTF-8(8-bit Unicode Transformation Format):為Unicode實作之一,記錄方式是8bit一個單元,不同的文字採用不固定的長度紀錄。使用1~4Bytes來儲存一個字元。
n ASCII字元只需1Bytes。
n 希臘字、阿拉伯文、敘利亞文及拉丁文需要2Bytes。
n 中文字則需要3Bytes來儲存。
b. UTF-16(16-bit Unicode Transformation Format):主要是用16bit為一單位,基本上與UTF-8相容。但UTF-16有兩種存存儲方式,主要分別是「尾序(Endian)」的不同
n Unicode-LE:Microsoft或Linux的文件是以LE(Little Endian)來存的。
n Unicode-BE:Macintosh的文件是以BE(Big Endian)來存的。
(2) Unicode為一種概念,一個字元對應到一個數字(code point)。由於相容於ASCII,廣度夠(支援不同語系),深度也夠(幾乎能呈現每一語系的所有字元),現已逐漸成為編碼的標準。在開發新系統時,若無需相容於舊系統的負擔,建議直接使用UTF-8為預設編碼,如此在系統間或同系統內不同元件交換資料時,處理編碼上較為輕鬆。
2. Code point:
(1) 科學家將全世界所有的文字與符號都收錄進一個巨大的表格內,並給予每一個字元一個獨一無二的「代碼」(碼位Code pint),此概念就稱為萬國碼(Unicode)。
(2) 在Unicode內,字元的Code point通常用「U+」開頭,後面緊接著一組16進位的數字來表示,例如U+5566,代表”啦”此字。
3. UTF(Unicode Transformation Format)與UCS(Universal Character Set):
(1) 如同上面提到電腦只懂0與1,還必須得將Unicode的字元轉換成0與1,才能在電腦呈現字元,這個轉換過程稱之為mapping。Unicode定義了兩種mapping 方法,分別為:UTF及UCS 編碼。
(2) UTF與UCS家族中各自有不同的編碼實作方式,例如UTF-7、UTF-8、UTF-16、UTF-32;UCS-2、UCS-4等,其中UCS-2是UTF-16已經過時的子集合,而UCS-4與UTF-32功能上是相同的。
(3) Unicode有這麼多編碼方式,看起來複雜,但一般使用者只須認識UTF家族即可,又以UTF-8最為常見。
4. UTF-8:
(1) Unicode紀錄了全世界所有的文字與符號,這麼多的文字與符號,如果要統一用固定長度的編碼方式來表達這麼多的文字,就必須得用多個位元組來表達一個字元,但會浪費儲存空間與傳輸寬頻。
(2) 對於英語系國家,使用ASCII編碼僅需1個Byte就能表達一個字元,若Unicode反而需要用多個Bytes才能表達一個字元,那大家不就都不想用Unicode了嗎。
(3) 而UTF-8可以解決此問題,UTF-8是個可變長度的編碼,它使用1~6Bytes來表達一個字元,並向下相容ASCII,也就是說,UTF-8前128個字元編碼與ASCII相同,如此一來處理英文字時就不會有浪費空間的問題。而當面對ASCII無法正確表示的字元時,UTF-8則使用多個Bytes來表達。
(4) 由於UTF-8具有可變長度以及不需要BOM(下述會提及)的優勢,UTF-8迅速地成為全世界最廣泛被使用的編碼方式。根據w3techs於2015年3月的調查顯示,全世界網頁有83.9%使用UTF-8編碼,壓倒性的佔有率。
(5) UTF-8是一種針對Unicode的可變長度字元編碼。記錄方式是以8bit一個單位,不同的文字採用不固定的長度紀錄(1~6bytes)。電子郵件、網頁、網路傳送的資料,優先採用的編碼。
5. UTF-16:用16bit為一單位,與UTF-8相容,有兩種儲存方式,Unicode-LE與Unicode-Be跟OS、CPU處理效能有關。
l 大尾序(Big-Endian,BE):Macintosh的文件是以BE來存的。
l 小尾序(Little-Endian,LE):Microsoft或Linux的文件是以LE來存的。
6. BOM:
(1) 先提及何謂Endianness,中文稱為位元組(bytes)順序,一種存儲規則。簡易的說,電腦內的資料都是以11010101 01100010這樣的方式儲存著,每8個bits為1byte,不同廠商製作的硬體在解釋一連串的0與1組合時,可能會有不同的方式去解釋位元組,解釋方式的不同,所mapping出來的字元就不同。若是使用錯誤的方式去解釋位元組,出來的結果會產生錯誤。
(2) 隨著科技發展,科學家採用一些方法來簡化Endianness造成的問題,例如Unicode Byte Order Mask(BOM)就是其中一個,UTF-16與UTF-32有Endianness的問題。
(3) 解決這錯誤的方式就是,主動在資料最前面加上一些特殊符號。這些特殊符號稱之為Unicode的Byte order mark(BOM)。當程式開啟這些檔案時,一看到檔案開頭的BOM就立刻知道,哦哦,這檔案是用UTF-16編碼的,且用某方式去解釋其位元組排列。
(4) 然而,當提到UTF-8不需要BOM,事實上,UTF-8也可以有BOM,Unicode並沒有強制規定。
7. Unicode與UTF之間的關係:
(1) 用例子來說明,「華啦啦啦,雨,下不停」,句子中的啦。
l 注音輸入法是:ㄌㄚ˙
l 拼音輸入法是:LA
l Unicode表內:U+5566
(2) 即使別人不知道注音跟拼音輸入法,只要知道Unicode的編碼是U+5566是啦這個字就可。
(3) 實際在編碼時,會依照使用的編碼方式不同,將啦這個字編成不同的0與1組合,如:
l BIG5:B0D5
l UTF-8:0xE5 0x95 0xA6,也就是11100101 : 10010101 : 10100110
(4) 要怎麼知道啦這個字的Unicode code print是U+5566,上網查就可以。
留言
張貼留言