CP_ACP和CP_OEMCP,分別是指當(dāng)前計(jì)算機(jī)上的Windows操作系統(tǒng)的Windows代碼頁(yè)與OEM代碼頁(yè)。對(duì)于東亞的簡(jiǎn)體中文、繁體中文、日文、韓文等Win操作系統(tǒng)語言環(huán)境,這兩種代碼頁(yè)是同一個(gè),如簡(jiǎn)體中文是代碼頁(yè)936即GB2312字符集,繁體中文是950即大五碼字符集,韓文是949、日文是932。對(duì)于西方國(guó)家的拼音文字語言設(shè)置,兩個(gè)代碼頁(yè)不同。典型的如English_US,其Windows代碼頁(yè)是1252、OEM代碼頁(yè)是437,還有第三個(gè)代碼頁(yè)ISO-8859-1又稱Latin-1或“西歐語言”,是針對(duì)英語法語西語德語等西歐語言的擴(kuò)展ASCII字符集。這三者(1252、437、8859-1)都是針對(duì)英語但并不相同。
為什么會(huì)有Windows代碼頁(yè)與OEM代碼頁(yè)的區(qū)別呢?因?yàn)樵诎耸甏鶧OS系統(tǒng)時(shí)期,還是“字符終端”的屏幕只能夠顯示的256個(gè)字符,這些字符的字形的點(diǎn)陣信息存儲(chǔ)在硬件的ROM中。DOS操作系統(tǒng)通過系統(tǒng)中斷調(diào)用驅(qū)動(dòng)程序把這些字形讀出來寫入顯存。這是由OEM負(fù)責(zé)字符集中有哪些字符,顯示時(shí)為什么字形的時(shí)代,而且一臺(tái)PC上只有這么一套字符集/字形,沒得選,除非你再差一個(gè)帶字庫(kù)的“漢卡”。進(jìn)入了微軟的Windows操作系統(tǒng)時(shí)代之后,由于硬件的發(fā)展,操作系統(tǒng)有了自己的字形文件,繪制字符時(shí)不再真地去讀ROM,而是用字形文件(就是字體fonts文件)來把字符的形狀寫入顯存??梢赃x擇用哪種字形:如有襯線的TimesNewRome,還是無襯線的SansSerif。操作系統(tǒng)默認(rèn)使用的字符集,就由微軟來定義了,如English_US使用Codepage1252;簡(jiǎn)體中文使用Codepage936(即國(guó)標(biāo)2312).至于那個(gè)OEM436,就是legacy,用于向后兼容。
綜上,就這么點(diǎn)事。CP_ACP和CP_OEMCP,分別是UINT的0和1。在WinNls.h中的注釋說明分別是“default toANSI code page”,“default to OEM codepage”。所以,在簡(jiǎn)體中文Windows,這兩個(gè)宏表示的都是代碼頁(yè)936.
下述程序代碼片段用于測(cè)試
UINTcodepage=936;
charstr[]="我們中國(guó)"; //這個(gè)char[]必然是多字節(jié)編碼字符串
DWORDlen;
//得到我們要轉(zhuǎn)換的MyString為UNICODE所需要的UNICODE緩沖區(qū)的長(zhǎng)度
len =MultiByteToWideChar(codepage, 0, str, -1, 0, 0);
wchar_t*buf=new wchar_t[len+10];
MultiByteToWideChar(codepage, 0, str, -1, buf,len);
setlocale(LC_CTYPE,"");//把當(dāng)前l(fā)ocale字符環(huán)境從C/C++缺省的"C"設(shè)置,改為操作系統(tǒng)的設(shè)置(即代碼頁(yè)936)
wprintf(L"%s",buf);//因?yàn)檫@個(gè)C標(biāo)準(zhǔn)庫(kù)函數(shù)的實(shí)現(xiàn),是把寬字符輸入又轉(zhuǎn)化為多字節(jié)字符去顯示,所以必須正確設(shè)置當(dāng)前操作系統(tǒng)的多字節(jié)編碼的代碼頁(yè)
結(jié)果:
1. 輸入是--char str[]="我們中國(guó)"; UINTcodepage=936或者54936(這是GB18030代碼頁(yè))或者CP_ACP或者CP_OEMCP,都能正確打印出結(jié)果“我們中國(guó)”。
2. 輸入是char str[]="иい瓣"; UINT codepage=950;也能正確把上述大五碼字符串打印出寬字符串輸出結(jié)果“我們中國(guó)”。
3. 輸入是char str[]="鎴戜滑涓浗 "; UINT codepage=65001;也能正確把上述UTF-8字符串打印出寬字符串輸出結(jié)果“我們中國(guó)”。

附錄:
一個(gè)在線GB/BIG5/UTF-8/UNICODE轉(zhuǎn)碼的網(wǎng)站http://www.dheart.net/bmzh/index.php
ps.實(shí)際上,簡(jiǎn)體中文Windows系統(tǒng)的默認(rèn)代碼頁(yè)936,不是只有6763個(gè)漢字的GB2316,正確說法是自1995年Windows95起,代碼頁(yè)936是GBK字符集,包含了20902個(gè)漢字。此前,代碼頁(yè)936與GB2316是一樣的。GB2316>> GBK >> GB18030 是向后兼容的。所以編程角度把這三者視作等同,也湊合啦。
愛華網(wǎng)



