字元,位元組和編碼
06-17
字元,位元組和編碼
[原創文章,轉載請保留或註明出處:http://www.regexlab.com/zh/encoding.htm]
級別:中級
摘要:本文介紹了字元與編碼的發展過程,相關概念的正確理解。舉例說明了一些實際應用中,編碼的實現方法。然後,本文講述了通常對字元與編碼的幾種誤解,由於這些誤解而導致亂碼產生的原因,以及消除亂碼的辦法。本文的內容涵蓋了「中文問題」,「亂碼問題」。
掌握編碼問題的關鍵是正確地理解相關概念,編碼所涉及的技術其實是很簡單的。因此,閱讀本文時需要慢讀多想,多思考。
引言
「字元與編碼」是一個被經常討論的話題。即使這樣,時常出現的亂碼仍然困擾著大家。雖然我們有很多的辦法可以用來消除亂碼,但我們並不一定理解這些辦法的內在原理。而有的亂碼產生的原因,實際上由於底層代碼本身有問題所導致的。因此,不僅是初學者會對字元編碼感到模糊,有的底層開發人員同樣對字元編碼缺乏準確的理解。
|
1. 編碼問題的由來,相關概念的理解
1.1 字元與編碼的發展
從計算機對多國語言的支持角度看,大致可以分為三個階段:
系統內碼 | 說明 | 系統 | |
階段一 | 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 |