編碼
概念
編碼,又稱代碼,是用預先規定的方法,將文字、數字或其他對象編成數碼,或將信息、數據轉換成規定的電脈衝信號。它在電子計算機、電視遙控和通訊等方面廣泛使用。
在電子計算機中,將指令和數字實行編碼後,適合計算機運行和操作。編碼作為計算機書寫指令的過程,是程式設計活動的一部分。在數字磁記錄中,可按照一定的規則,進行輸入信息序列向編碼序列的過程轉換。在遙控系統和通信系統中,採用編碼步驟可提高傳送的效率和可靠性。
將數據轉換為編碼字元,必要時又可編碼成原來的數據形式。
字元集與編碼
各個國家和地區所制定的不同 ANSI 編碼標準中,都只規定了各自語言所需的“字元”。比如:漢字標準(GB2312)中沒有規定韓國語字元怎樣存儲。這些 ANSI 編碼標準所規定的內容包含兩層含義:
使用哪些字元。也就是說哪些漢字,字母和符號會被收入標準中。所包含“字元”的集合就叫做“字元集”。
規定每個“字元”分別用一個位元組還是多個位元組存儲,用哪些位元組來存儲,這個規定就叫做“編碼”。
1.使用哪些字元。也就是說哪些漢字,字母和符號會被收入標準中。所包含“字元”的集合就叫做“字元集”。
2.規定每個“字元”分別用一個位元組還是多個位元組存儲,用哪些位元組來存儲,這個規定就叫做“編碼”。
各個國家和地區在制定編碼標準的時候,“字元的集合”和“編碼”一般都是同時制定的。因此,平常所說的“字元集”,比如:GB2312、GBK、JIS 等,除了有“字元的集合”這層含義外,同時也包含了“編碼”的含義。
“UNICODE 字元集”包含了各種語言中使用到的所有“字元”。用來給 UNICODE 字元集編碼的標準有很多種,比如:UTF-8、UTF-7、UTF-16、UnicodeLittle、UnicodeBig 等。
意義
如上文所述,編碼是依據預先規定的標準將某一對象信息編程計算機可識別的數碼,因此,如果沒有規定標準的編碼方法,那么有這些獨立的、不統一的編碼規則實現的程式,將不具兼容性,易出現如亂碼等由於編碼格式一致或不兼容引起的問題。
發展
字元與編碼的發展
發展
從計算機對多國語言的支持角度看,大致可以分為三個階段:
系統內碼 | 說明 | 系統 | |
階段一 | ASCII | 計算機剛開始只支持英語,其它語言不能夠在計算機上存儲和顯示。 | 英文 DOS |
階段二 | ANSI編碼 (本地化) | 為使計算機支持更多語言,通常使用 0x80~0xFF 範圍的 2 個位元組來表示 1 個字元。比如:漢字 '中' 在中文作業系統中,使用 [0xD6,0xD0] 這兩個位元組存儲。 不同的國家和地區制定了不同的標準,由此產生了 GB2312, BIG5, JIS 等各自的編碼標準。這些使用 2 個位元組來代表一個字元的各種漢字延伸編碼方式,稱為ANSI 編碼。在簡體中文系統下,ANSI 編碼代表 GB2312 編碼,在日文作業系統下,ANSI 編碼代表 JIS 編碼。 不同 ANSI 編碼之間互不兼容,當信息在國際間交流時,無法將屬於兩種語言的文字,存儲在同一段ANSI 編碼的文本中。 | 中文 DOS,中文 Windows 95/98,日文 Windows 95/98 |
階段三 | UNICODE (國際化) | 為了使國際間信息交流更加方便,國際組織制定了UNICODE 字元集,為各種語言中的每一個字元設定了統一併且唯一的數字編號,以滿足跨語言、跨平台進行文本轉換、處理的要求。 | Windows NT/2000/XP,Linux,Java |
字元串在記憶體中的存放方法
在 ASCII 階段,單位元組字元串使用一個位元組存放一個字元(SBCS)。比如,"Bob123" 在記憶體中為:
42 | 6F | 62 | 31 | 32 | 33 | 00 |
B | o | b | 1 | 2 | 3 | \0 |
在使用 ANSI 編碼支持多種語言階段,每個字元使用一個位元組或多個位元組來表示(MBCS),因此,這種方式存放的字元也被稱作多位元組字元。比如,"中文123" 在中文 Windows 95 記憶體中為7個位元組,每個漢字占2個位元組,每個英文和數字字元占1個位元組:
D6 | D0 | CE | C4 | 31 | 32 | 33 | 00 |
中 | 文 | 1 | 2 | 3 | \0 |
在 UNICODE 被採用之後,計算機存放字元串時,改為存放每個字元在 UNICODE 字元集中的序號。目前計算機一般使用 2 個位元組(16 位)來存放一個序號(DBCS),因此,這種方式存放的字元也被稱作寬位元組字元。比如,字元串 "中文123" 在 Windows 2000 下,記憶體中實際存放的是 5 個序號:
2D | 4E | 87 | 65 | 31 | 00 | 32 | 00 | 33 | 00 | 00 | 00 | ← 在 x86 CPU 中,低位元組在前 |
中 | 文 | 1 | 2 | 3 | \0 |
一共占 10 個位元組。
常見格式
常見的編碼格式有ASCII、ANSI、GBK、GB2312、UTF-8、GB18030和UNICODE等。對應的編碼規則有單位元組字元編碼、ANSI編碼和UNICODE編碼等。
分類 | 編碼標準 | 說明 |
單位元組字元編碼 | ISO-8859-1 | 最簡單的編碼規則,每一個位元組直接作為一個 UNICODE 字元。比如,[0xD6, 0xD0] 這兩個位元組,通過 iso-8859-1 轉化為字元串時,將直接得到 [0x00D6, 0x00D0] 兩個 UNICODE 字元,即 "ÖÐ"。 反之,將 UNICODE 字元串通過 iso-8859-1 轉化為位元組串時,只能正常轉化 0~255 範圍的字元。 |
ANSI 編碼 | GB2312, BIG5, Shift_JIS, ISO-8859-2 …… | 把 UNICODE 字元串通過 ANSI 編碼轉化為“位元組串”時,根據各自編碼的規定,一個 UNICODE 字元可能轉化成一個位元組或多個位元組。 反之,將位元組串轉化成字元串時,也可能多個位元組轉化成一個字元。比如,[0xD6, 0xD0] 這兩個位元組,通過 GB2312 轉化為字元串時,將得到 [0x4E2D] 一個字元,即 '中' 字。 “ANSI 編碼”的特點: 1. 這些“ANSI 編碼標準”都只能處理各自語言範圍之內的 UNICODE 字元。 2. “UNICODE 字元”與“轉換出來的位元組”之間的關係是人為規定的。 |
UNICODE 編碼 | UTF-8, UTF-16, UnicodeBig …… | 與“ANSI 編碼”類似的,把字元串通過 UNICODE 編碼轉化成“位元組串”時,一個 UNICODE 字元可能轉化成一個位元組或多個位元組。 與“ANSI 編碼”不同的是: 1. 這些“UNICODE 編碼”能夠處理所有的 UNICODE 字元。 2. “UNICODE 字元”與“轉換出來的位元組”之間是可以通過計算得到的。 |