青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

只要你和計算機打交道,這些問題可以說是天天會遇到,但是很多人是似懂非懂, 能真正完全理解的人卻不多, 下面是個人的一些理解,有錯歡迎指正.

最早的計算機只支持ASCII碼, 具體來說就是用1個字節(jié)(最高位為0, 沒有用)表示0到127,總共128個字符, 這樣就可以完全滿足英語應(yīng)用的要求了。

后來擴展到歐洲語系,理論上一個字節(jié)可以表示256個字符, 歐洲人就把剩余的128個字符(最高位為1)按照自己語言(法語,德語...)的要求擴充應(yīng)用了起來, 好像也能滿足需要。

然后又到了亞洲國家,比如中國,中文漢字有十多萬,這剩余的128個字符根本不夠我用啊, 怎么辦? 于是就有了兩個字節(jié)的編碼,如中文的GBK, GB2312, BIG5等,當然日語,韓語等其他亞洲國家也有自己編碼方式。

這就是所謂的多字節(jié)編碼(MBCS)方式, Win95/98時代只支持這種方式, 那時候處理字符串非常痛苦, 因為它里面有些字符是一個字節(jié)表示的,也有一些是多個字節(jié)表示的, 比如字符串"你好abc", 里面明明是5個字符,strlen返回長度卻是7, 你要正確識別字符個數(shù),可以使用類似_mbslen的API, 但是實際上該API內(nèi)部會綁定當前的字符集, 不然神仙也識別不了。

要統(tǒng)一解決上面的問題, 需要有一個世界通用的統(tǒng)一編碼格式, 那就是UNICODE。
 UNICODE個人感覺分廣義和狹義, 廣義的UNICODE包括UTF8, UCS2, UCS4, 而狹義的UNICODE(主要是Windows平臺)就是指UCS2。
先說UCS2, Windows平臺上常說的UNICODE實際上就是指UCS2, 簡單來說就是統(tǒng)一用2個字節(jié)的編碼,表示實際上所有語言的常用字符。
再說UTF8, 有了上面的UCS2,為甚么還有要UTF8? UCS2把任何字符全都編碼成2個字節(jié)(包括我們常用的英文字符), 這樣極大地增加了網(wǎng)絡(luò)傳輸和數(shù)據(jù)存儲的開銷,于是就有了UTF8。UTF8對英文字符還是1個字節(jié)存儲,只對其他語言字符用多個字節(jié)存儲(2-6個字節(jié))。UTF8和UNICODE可以完全對應(yīng)的相互轉(zhuǎn)換, 具體可以參考這里
為什么還要有 UCS4? UCS2用2個字節(jié),最多也只能表示0xFFFF+1 = 65536個字符, 但是我們僅漢字就有十多萬,所以UCS2/UTF8收錄的也只是我們一些常用的漢字, 所以我們需要UCS4, 用4個字節(jié)表示一個字符,可以表示0xFFFFFFFF+1=4294967296個字符, 它才是我們以后的終極解決方案。

在Windows上不同編碼方式的相互轉(zhuǎn)換可以通過WideCharToMultiByteMutiByteToWideChar進行, 它里面WideChar就是指UCS2, 可以看到它這里把UTF8也命名成MultiByte, 是不是有點誤導(dǎo)...

下面再談小大小端(little-endian, big-endian).

計算機是以字節(jié)為尋址單位的,這就涉及到字(2個字節(jié)), 雙字(4個字節(jié))及其他多字節(jié)單位 在計算機內(nèi)如何排布的問題, 這里無非就是2種:低字節(jié)在低地址的little-endian和高字節(jié)在低地址的big-endian.
如何區(qū)分當前系統(tǒng)是哪種類型的大小端? 曾經(jīng)看到有經(jīng)驗的程序員也以當前的操作系統(tǒng)類型來判斷, 實際上系統(tǒng)的大小端和你的CPU架構(gòu)體系相關(guān)聯(lián), 比如說X86是小端, PowPC是大端,ARM則是可控制(默認也是小端)。
要判斷當前環(huán)境是大小端實際上很簡單: bool IsLittleEndian()  {  int i=1;  return (*(char *)&i == 1); }
曾經(jīng)看到公司跨平臺的代碼沒有通過大小端轉(zhuǎn)換,直接通過memcpy某個表示長度的int在客戶端之間傳送,卻沒有發(fā)生問題, 感覺很奇怪, 最后發(fā)現(xiàn)原來公司的所有native客戶端(Win, Mac, ios, Android,BlackBerry,Linux)全都是小端。感覺現(xiàn)在大端的應(yīng)用主要是網(wǎng)絡(luò)字節(jié)序, Java內(nèi)部全都是大端。
上面的UCS2和UCS4因為都是用多字節(jié)表示一個字符, 所以實際上都有大小端的問題,比如分別對應(yīng)UCS2-LE和UCS2-BE,Windows上的UNICODE實際上是UCS2-LE, UTF8因為是字節(jié)流,所以沒有大小端的問題。

下面再說一下BOM (Byte Order Mark), 上面說了各種編碼方式以及大小端的問題, 那么我們怎么知道某個文本或者數(shù)據(jù)流是何種編碼方式? 
一般來說有3種方法:一種是分本顯示指定, 比如web里html頭一般會有這么一段"content="text/html;charset=utf-8"; 要不就是大家默認約定,比如自定義的網(wǎng)絡(luò)數(shù)據(jù)流內(nèi)的字符串一般都會用UTF8編碼; 還有一種就是用BOM,通過在文件頭里填入BOM規(guī)定的字節(jié),從而區(qū)分文件是何種編碼類型: 
UTF-8 0xEF 0xBB 0xBF
UCS2 BE 0xFE 0xFF
UCS2 LE 0xFF 0xFE
UCS4 BE 0x00 0x00 0xFE 0xFF
UCS4 LE 0xFF 0xFE 0x00 0x00
有興趣的同學(xué)可以用notepad保存,試下各種效果, 然后用UltraEdit的16進制方式查看驗證。

上面關(guān)于各種字符編碼方式的集合構(gòu)成了所謂的字符集/代碼頁相關(guān)的概念, 下面是是一些常用的代碼頁及其字符集: 
代碼頁(CodePage)字符集(CharSet)
Description
936
GB2312
簡體中文(GB2312)
950
BIG5
繁體中文(BIG5)
1200
UTF-16
Unicode (UCS2-LE)
1201
unicodeFFFE
Unicode (UCS2-BE)
65000
UTF-7
Unicode (UTF-7)
65001
UTF-8
Unicode (UTF-8)
65005
UTF-32
Unicode (UCS4-LE)
65006
UTF-32 (BE)
Unicode (UCS4-BE)

最后討論下C++編程中常見的關(guān)于字符編碼方式相關(guān)的問題。

在C++編程中, 我們常打交道的無非是編輯器和編譯器, 對編輯器起來說,我們常遇到就是亂碼問題, 比如中文注釋顯示或是保存不了等, 解決辦法就是把你的文件保存成Unicode(UTF8)。
對于編譯器來說, 編碼方式取決于它對C++標準的支持程度, 比如C++ 11以前,字符串我們只能指定成2種:一種是MBCS,如char* p="abc哈哈"; 還有一種是UCS2, 比如wchar_t*p = L"abc哈哈", 這樣編譯器就知道你要表示的字符串類型。C++11之后,標準增加了UTF8和UCS4的支持, 比如char* p=u8"abc哈哈"表示UTF8,wchar_t* p=u"abc哈哈"表示UCS2(實際上和L"xxxx"一樣), char32_t* p=U"abc哈哈"表示UCS4。這里要區(qū)分編譯期和運行期, 盡管C++11之前在編譯期我們沒法告訴編譯器我們這個常量串是UTF8格式的,但是程序運行期我們還是可以使用所有的編碼式(MBCS/UTF8/UCS2/UCS4), 因為這些最終在內(nèi)存里都是二進制流。
另外C++11還增加了UTF8, UCS2, UCS4相互轉(zhuǎn)碼的支持:
std::codecvt_utf8 封裝了UTF8相關(guān)的編碼轉(zhuǎn)換
std::codecvt_utf16 封裝了UCS2相關(guān)的編碼轉(zhuǎn)換
std::codecvt_utf8_utf16 封裝了UTF8與UCS2的編碼轉(zhuǎn)換

對于C++跨平臺開發(fā), 我們經(jīng)常遇到的就是默認用那種編碼方式的問題,我們會發(fā)現(xiàn)Windows 的UCS2解決方案對其他平臺來說是個異類, 一般來說有2種解決方法:
一種是統(tǒng)一用UTF8 , 但是這樣對Windows來說有點麻煩, 因為Windows的API都是UCS2的,所以這種方式意味著任何字符串在傳給Windows API 之前都要從UTF8轉(zhuǎn)成UCS2; 還有一種就是用#define宏了, Windows上將字符串相關(guān)宏全都定義成UCS2, 其他平臺則全都定義成UTF8, 該方式要求就你在寫代碼時頭腦要比較清醒,因為同樣的代碼在不同平臺上的編碼格式是不一樣的。

一直很好奇,誰知道Windows為什么不用UTF8,非要搞得和其他平臺不一樣?
posted on 2015-07-25 01:11 Richard Wei 閱讀(4707) 評論(2)  編輯 收藏 引用 所屬分類: C++

FeedBack:
# re: 關(guān)于字符集,編碼格式,大小端的簡單總結(jié)
2015-07-25 01:40 | test
因為nt內(nèi)核用的是ucs2,那是89年,utf8到了92年才發(fā)明出來。  回復(fù)  更多評論
  
# re: 關(guān)于字符集,編碼格式,大小端的簡單總結(jié)
2015-07-25 19:55 | Richard Wei
@test
看來確實是歷史原因, 不過對于運行期的程序來說,個人倒是更贊同Windows的做法,忽略內(nèi)存因素,Windows的UCS2編碼相對于其他平臺的UTF8更統(tǒng)一和高效。  回復(fù)  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲特级毛片| 亚洲欧美影院| 欧美性开放视频| 欧美日韩人人澡狠狠躁视频| 蜜臀99久久精品久久久久久软件| 老巨人导航500精品| 蜜桃伊人久久| 欧美美女bbbb| 国产精品网站在线| 一区二区亚洲精品国产| 亚洲国产精品综合| 一本综合久久| 久久精品天堂| 欧美激情在线狂野欧美精品| 日韩一级欧洲| 久久久999精品| 欧美日本在线观看| 国产亚洲欧美色| 亚洲精品字幕| 欧美一区成人| 91久久精品一区二区三区| 亚洲精品免费在线观看| 亚洲一区二区三区免费视频| 欧美在线地址| 欧美日韩喷水| 亚洲国产老妈| 亚洲欧美国产精品专区久久| 国产伦精品一区二区三区高清| 国产午夜精品视频| 99精品欧美一区二区三区| 欧美一区二区三区在线视频| 乱码第一页成人| 亚洲视频在线观看网站| 久久亚洲精选| 国产伦精品一区二区三区| 亚洲精品视频在线播放| 久久精品99久久香蕉国产色戒| 91久久国产综合久久蜜月精品 | 最新亚洲激情| 欧美淫片网站| 亚洲精品欧美| 欧美不卡福利| 国内外成人免费激情在线视频网站 | 亚洲黄色尤物视频| 久久精品国产综合| 99综合在线| 欧美高清视频在线观看| 狠狠88综合久久久久综合网| 亚洲欧美成人| 夜夜嗨av一区二区三区网站四季av| 久久久一区二区三区| 国产一区二区三区四区在线观看| 亚洲综合色网站| 一本久道久久综合婷婷鲸鱼| 欧美激情一区二区三区在线| 在线观看中文字幕亚洲| 玖玖精品视频| 久久女同互慰一区二区三区| 国产亚洲精品v| 久久久久久久一区二区| 亚洲一区二区三区久久| 国产精品一区二区久久久| 午夜激情亚洲| 亚洲欧美日韩中文在线制服| 国产精品日韩| 久久黄色小说| 久久久7777| 亚洲国产精品一区二区三区| 久久婷婷麻豆| 可以免费看不卡的av网站| 亚洲国产精品成人综合| 亚洲第一二三四五区| 欧美国产丝袜视频| 在线亚洲精品| 亚洲欧美偷拍卡通变态| 国内成人精品2018免费看| 久久综合给合| 欧美激情视频免费观看| 亚洲免费观看| 久久国产精品99精品国产| 国产精品尤物| 久久综合九色综合欧美狠狠| 久久免费国产精品1| 亚洲日本va午夜在线影院| 日韩天堂av| 国产视频久久久久久久| 欧美粗暴jizz性欧美20| 欧美精品在线视频| 香蕉久久一区二区不卡无毒影院| 欧美一区中文字幕| 亚洲美女在线一区| 亚洲欧美激情视频| 亚洲国产一区二区三区高清| 亚洲麻豆视频| 红桃视频一区| 一本色道**综合亚洲精品蜜桃冫| 国产日韩一区| 亚洲精品免费网站| 国产一区二区三区不卡在线观看| 亚洲福利免费| 国产区精品视频| 亚洲精品护士| 影音欧美亚洲| 亚洲欧洲99久久| 一本久久综合亚洲鲁鲁五月天 | 久久久久99| 亚洲一区二区伦理| 奶水喷射视频一区| 久久成人在线| 国产精品国产一区二区| 牛牛精品成人免费视频| 国产精品入口福利| 亚洲精品免费观看| 最新中文字幕亚洲| 欧美亚洲免费| 亚洲男女毛片无遮挡| 欧美大片专区| 免费久久精品视频| 国产视频欧美视频| 亚洲男女毛片无遮挡| 一区二区国产精品| 欧美大片第1页| 免费看精品久久片| 激情成人在线视频| 欧美综合国产精品久久丁香| 亚洲综合视频网| 欧美三级网址| 亚洲天堂男人| 香蕉久久精品日日躁夜夜躁| 国产精品久久久久999| aa级大片欧美| 亚洲一区二区在线播放| 欧美视频在线一区二区三区| 亚洲精品美女91| 国产精品99久久久久久有的能看| 欧美 日韩 国产在线 | 欧美一级欧美一级在线播放| 欧美日韩中文字幕精品| 亚洲理论在线观看| 中文欧美在线视频| 欧美性一二三区| 国产伦精品一区二区三区免费 | 亚洲精品黄网在线观看| 久久视频一区二区| 欧美成人精品不卡视频在线观看| 国产综合av| 久久久综合香蕉尹人综合网| 久热精品视频在线免费观看| 激情久久中文字幕| 女仆av观看一区| 亚洲狼人综合| 午夜精品国产| 一色屋精品视频在线看| 久久综合亚州| 亚洲精品一区二区在线| 一区二区三区日韩精品| 国产精品久久久久久影视| 亚洲欧美一区二区三区极速播放| 久久国产66| 亚洲高清网站| 欧美视频在线免费| 久久久久高清| 亚洲美女黄色片| 久久精品国产久精国产一老狼 | 久久激情综合网| 亚洲国产欧美在线人成| 一区二区三区国产精品| 国产精品美女久久久久久久| 欧美一区日韩一区| 亚洲经典视频在线观看| 欧美一区三区二区在线观看| 激情视频一区二区| 欧美日韩免费看| 久久国产一区二区三区| 最新高清无码专区| 欧美制服第一页| 日韩亚洲精品视频| 国产亚洲日本欧美韩国| 欧美激情综合五月色丁香小说 | 亚洲欧美日韩在线综合| 女人香蕉久久**毛片精品| 亚洲色图自拍| 亚洲国产精品成人综合| 国产精品久久波多野结衣| 久久先锋影音av| 亚洲综合首页| 亚洲精品影院| 欧美福利在线观看| 欧美资源在线观看| 亚洲视频在线观看免费| 亚洲高清视频一区二区| 国产日韩av高清| 欧美午夜久久久| 欧美大成色www永久网站婷| 久久高清免费观看| 亚洲欧洲av一区二区| 一区二区三区四区精品| 91久久国产自产拍夜夜嗨| 欧美成人在线影院| 久色成人在线|