說起這事,就要從1952年馮諾依曼設計的計算機EDVAC說起。
EDVAC雖然不是世界上第一臺計算機,但它是第一臺採用二進位計算的現代計算機。
當時計算機只是為數學運算服務的,那時計算機還不能輸入、處理各種英文、中文等文本,更別提音頻、圖像、視頻等多媒體內容。
作為第一臺計算機的ENIAC採用的是十進位計算,所以在數學計算時不用任何轉換。
但是二進位的EDVAC卻需要使用二進位「0101」這些數字表示十進位數字,這時計算機就使用了第一種編碼——BCD碼。
BCD碼是用4位二進位數來表示十進位數中的0到9這10個數中的任意一位。比如8421 BCD碼0010表示2,0100表示4。
那麼什麼是編碼呢?
之所以出現編碼,原因就是計算機內部是各種高低電壓信號,這些高低電壓信號被人類形象記憶為「0101」等二進位數。
從這裡就可以看出計算機是不識別人類信息的,它只是根據科學家對其內部電路的設計,將一堆高低電壓信號轉換為另一堆高低電壓信號。
當計算機對用戶輸入的十進位展開運算時,它首先使用內部電路將十進位數字轉換為自己識別的二進位數,也就是高低電壓信號,這個轉換的過程就叫做「編碼」,而轉換的標準就是編碼格式。
比如按照8421BCD編碼格式5是0101,但是換成另一種編碼格式5421BCD卻是1000。
與之相反的過程,計算機將各種高低電壓信號(二進位數)按照逆向標準轉化為人類可讀信息叫做「解碼」。
隨著計算機處技術的發展,數學運算可以通過符號進行簡單、快捷的控制了。這時計算機的輸入信息也就要求不局限於數字了,英文字母和各種符號急需被計算機識別。
這時候大家熟悉的ASCII碼就誕生了,ASCII碼將英文字母、數字、特殊符號用一個字節(8位bit)進行編碼,其中最高位是奇偶校驗位,剩下7位用於表示輸入字符,ASCII碼一共能表示128個字符。
因為ASCII碼是為了解決計算機識別美國用戶輸入字符的問題,所以當計算機進入非英語國家時,計算機就不識別所在地的輸入信息了。
這個問題對於拉丁語系的國家比較簡單,直接讓原ASCII碼的最高位也參與字符編碼,不再作為奇偶檢驗位,這樣就能表示256個符號了。
然而,當計算機進入亞洲時就表示「帶不動了」,漢字、日語、韓語裡面的字符太多了。
於是中國在1981年設計了基於ASCII編碼的GB2312編碼,「GB」是「國標」拼音首字母,GB2312使得計算機能夠識別簡體中文;big5支持繁體中文;日本使用Shift_JIS編碼讓計算機識別日文,韓國則是使用Euc-kr編碼使計算機運行韓語。
上面說過ASCII碼採用一個字節編碼,而我國的GB2312使用的是兩個字節。
由於後者是在前者之上創建的,所以對於ASCII碼中的符號、數字、英文字母等,GB2312都使用兩個字節重新編碼,此時這些符號叫做「全形」字符,而原來ASCII中的128個字符叫做「半角」字符。
對於漢字來說,全形模式和半角模式效果等同,底層也都是使用兩個字節。
但是對於英文字母、符號來說,半角、全形效果不同:半角符號採用一個字節,如字符a,編碼97,與ASCII碼一致;但是全形符號採用兩個字節,字符a編碼為65345。
從使用效果上看,當我們輸入英文,尤其是輸入網站的註冊名、密碼等信息,編寫含有英文的文檔、編程的時候,一定要使用半角符號。
鑑於半角模式能正常漢字還能正確輸入英文,所以日常生活中推薦大家使用半角模式。
GB2312的缺點是不支持繁體漢字,所以1995年在其基礎上發行了GBK編碼,「GBK」是「國標擴展」的拼音簡寫。後來又誕生了GB18030,目的是增強對我國少數民族文字的支持。
說句題外話,80年代的時候,由於內存容量較小,所以GB字符集並沒有直接存儲在計算機上,而是集成在一種叫做「漢卡」的可插拔硬體的晶片中,當它插在計算機主板ISA插槽時可以顯示中文。
下圖就是漢卡。
史玉柱的巨人漢卡、求伯君的金山漢卡、柳傳志的聯想漢卡、雷軍的漢卡創業都是這個時代關於計算機如何本地化的商業成果。
回到主線,僅僅我國就有不下三種的編碼格式,那麼世界上存在的編碼格式種類之多可想而知。
而且各個編碼之間互不兼容,很容易出現亂碼問題,比如在中國計算機內編碼33376表示漢字「俙」,一旦含該漢字的文件在日語編碼的計算機中打開就會顯示為「A」。
為了將所有語言的編碼格式統 一在一套編碼規範中,Unicode字符集出現了。
注意Unicode只是一個字符集,代表一種標準,不是編碼格式。
Unicode字符集於1994年公布,它為每種語言中的每個字符都設定了統 一併且獨一無二的二進位編碼。
Unicode規定所有字符使用十六進位數字表示,而且在書寫時在前面加上前綴「U+」,比如字母「A」的對應的數值是 0X0041,因此字符「A」使用「U+0041」表示。
由於Unicode身為字符集只是規定了符號的二進位代碼,對於如何存儲、處理並沒有規定,所以對Unicode進行實現的UTF系列編碼格式應運而生。
UTF編碼系列包括UTF-8、UTF-16和UTF-32,我們經常使用的是UTF-8。
UTF-8最低使用8bit,也就是一個字節表示一個字符,隨著字符的增加它的存儲空間也隨之增加,最高使用4個字節。
這是UTF-8和UTF-16的特點,用一種編碼存儲空間可變的方式表示一個字符。在儘量多的覆蓋不同字符的同時,減小了存儲空間。
以上就是本次科普「關於計算機字符編碼」的主要內容,如果錯誤,望批評指正!