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

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