咱花一個下午給自己歸納 了 下字符編碼知識= ?=,在腦子里理理順當~
ASCII : 早期的字符集,7位,128個字符,包括大小寫a-z字母,0-9數字以及一些控制字符.
擴展ASCII :?1個字節8位,只用7位不合理.于是第8位用于擴展ASCII字符集,這樣就又多了128個字符.于是用著后128個字符來擴展表示如拉丁字母,希臘字母等特殊符號.但問題是歐洲那一票國家很多互相都擁有不相同的特殊字母,一起塞進后128個明顯不夠,于是代碼頁出現了.
Code Page ( 代碼頁 ) : 1個字節前128個字符大家統一和ASCII一樣,而后128個字符,根據不同系統所謂 代碼頁 來區分各個語言不相同的字母和符號.
DBCS ( 雙字節字符集 ) : 對于亞洲國家,后128個字符依然無法包含大量的象形文字,DBCS正是為此的一個解決方案.DBCS由 一個或兩個 字節表示一個字符,這說明DBCS并不一定是兩個字節,對于如英文字母,是向ASCII兼容的,依然由1個字節表示,而對于如中文則用2個字節表示.英 文和中文可以統一地處理,而區分是否為中文編碼的方法是2個字節中的高字節的首位為1,就必須檢查后面跟隨的那個字節,2個字節一起解釋為1個字符.GB2312,GBK到GB18030都屬于DBCS. 另外,簡體中文Windows下的ANSI編碼通常是指GBK(代碼頁936) .
DBCS很大問題在于字符串的 字符數 不能通過 字節數 來決定,如"中文abc", 字符數 是5,而 字節數 是7.對于用++或--運算符來遍歷字符串的程序員來說,這簡直就是夢魘!
Unicode : 學名為 " Universal Multiple-Octet Coded Character Set ",簡稱" UCS ". UCS可以看作是"Unicode Character Set"的縮寫.
也是一種字符集/字符編碼方法, 它統一用唯一的字符集來包含這個星球上多數語言的書寫系統.UCS向ASCII兼容(即前128個字符是一致的),但并不兼容DBCS,因為其他字符在UCS中被重新編碼(重新安排位置).
UCS有
兩種格式:
UCS-2
和
UCS-4
.前者用2個字節(16位)編碼,后者用4個字節(
實際上只用31位
)編碼.USC-4前2個字節都為0的部分稱為
BMP(基本多語言平面)
,就是說BMP去掉前2個零字節就是UCS-2.
目前的UCS-4規范中還沒有任何字符被分配在BMP之外.
(說白了,USC-4就是為當16位的USC-2都被分配完時候做再做擴展用的,現在還沒用到)
UTF-8,UTF-16,UTF-32
: "
Unicode transformation format"(UTF)
?,即Unicode的傳輸格式.Unicode規定了怎么編碼字符,而UTF規定怎么將一個Unicode字符單元映射到字節序來傳輸或保存.
UTF-16 和 UTF-32 分別表示以16位和32位為一個Unicode單元進行編碼, 其實UTF-16對應就是UCS-2,UTF-32 對應就是 UCS-4(UCS-2和UCS-4是陳舊的說法,應拋棄) [看這里] . ? 另外,通常說的Unicode就是指UTF-16.
UTF-8 是關鍵!如果統一Unicode都用2字節表示,英文字母覺得自己就很吃虧(高字節始終是0字節).UTF-8提供了一種靈活的解決辦法: 以單字節(8bit)作為編碼單元,變長多字節編碼方式 . 如ASCII字母繼續使用1字節儲存,中文漢字用3字節儲存,其他最多可直6字節. (具體格式看末尾參考文章> ?<懶)
UTF-16和UTF-32需要有字節序標志 BOM (FEFF) 解決大端小端問題 .UTF-8 沒有字節序的問題 (因為以1個字節為單元).
?
===============================================================================
其他注意點:
DBCS準確說,應該是MBCS(Multi-Byte Chactacter System,?多字節字符系統).
字符集(Charset)和編碼(Encoding)注意區別.如GBK,GB2312以及Unicode都既是字符集,也是編碼方式,而UTF-8只是編碼方式,并不是字符集.
Linux下The GUN C?Library(從
glibc 2.2開始
)中寬字符wchar_t是以32位的Unicode(USC-4)表示.如寬字符"中"字為 "0x00004e2d".而Windows下的CRT使用寬字符仍是16位的.
?
參考:
談談Unicode編碼,簡要解釋UCS、UTF、BMP、BOM等名詞
關于unicode,mbcs,utf8,charset,encoding等相關概念的說明
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
