目前,大陸地區常見的中文編碼有以下三種。
GB2312
GB2312(1980年)一共收錄了7445個字符,包括6763個漢字和682個其它符號。漢字區的內碼范圍高字節從B0-F7,低字節從A1-FE,占用的碼位是72*94=6768。其中有5個空位是D7FA-D7FE。在windows中的代碼頁是GBK
GBK最初是由微軟對GB2312的擴展,也就是CP936字碼表 (Code Page 936)的擴展。最初出現於Windows 95簡體中文版中,由於Windows產品的流行和在大陸廣泛被使用,中華人民共和國國家有關部門將其作為技術規范。注意GBK並非國家正式標准,只是國家技術監督局標准化司、電子工業部科技與質量監督司發布的“技術規范指導性文件”。GB18030
2000年的GB18030是取代GBK1.0的正式國家標准。該標准收錄了27484個漢字,收錄了藏文、蒙文、維吾爾文等主要的少數民族文字。現在的PC平台必須支持GB18030,對嵌入式產品暫不作要求。所以手機、MP3一般只支持GB2312。
內碼一般是指缺省代碼頁指定的編碼,缺省代碼頁是默認用來解釋字符的編碼。簡體中文windows系統缺省代碼頁是GBK。
ANSI編碼:即所有在ASCII基礎上擴充的字符編碼的統稱。在英文操作系統中ANSI是ASCII編碼,繁體中文系統中ANSI是Big5編碼,日文系統中ANSI是Shift_JIS編碼,簡體中文系統有點特殊,比如:editplus或記事本的默認編碼為ANSI,但具體ANSI代表的是gbk還是gb2312還是gb18030,由這些編輯器根據碼流去識別。window下很多文本編輯器都沒有強行采用某種特定的編碼,統一使用系統編碼,所以中文win系統中ANSI就是GBK。
LCMAP_SIMPLIFIED_CHINESE表示traditional Chinese字符集到simplified Chinese字符集的映射,LCMAP_TRADITIONAL_CHINESE相反。函數參數可參見msdn。
大多數情況下簡繁的轉化是GBK字符集內部的相互映射,但是有時我們會碰到另一種常見的繁體編碼:“大五碼”。Big5碼是一套雙字節字符集,BIG5碼是通行於台灣、香港地區的一個繁體字編碼方案,其對應代碼頁為950。來看與的相互轉化,它們二者通過Unicode字符集相關聯,Big5<—>Unicode<—>GBK,類似思想可參見,程序實現如下
* GBK2BIG5(* wcsLen = ::MultiByteToWideChar(CP_ACP, NULL, szBuf, -, NULL, * wszString = -, wszString, wcsLen); ansiLen = ::WideCharToMultiByte(, NULL, wszString, -, NULL, * szAnsi = , NULL, wszString, -, szAnsi, ansiLen, NULL, NULL); * BIG52GBK(* wcsLen = ::MultiByteToWideChar(, NULL, szBuf, -, NULL, * wszString = , NULL, szBuf, -, wszString, wcsLen); ansiLen = ::WideCharToMultiByte(CP_ACP, NULL, wszString, -, NULL, * szAnsi = -, szAnsi, ansiLen, NULL, NULL);
上述程序實現了繁體字下GBK和Big5碼的相互轉化,由於簡體中文操作系統中ANSI默認是GBK編碼,“中國”二字轉碼為Big5碼後,系統仍然按照GBK編碼進行解析後顯示,這樣勢必是亂碼的。如果想要得到Big5編碼下的正確顯示,可以更改系統的語言,將Big5作為其默認ANSI即可,如下:打開“控制面板”->“區域和語言”
重啟計算機,台灣地區系統默認使用Big5碼。如果剛才把GBK->Big5的結果保存到txt中,這時會發現txt文檔中保存的“い瓣”變成了“中國”。在Big5編碼下,有些大陸的網頁可能會顯示亂碼,建議再改回原來的設置。
上述實現了繁體字GBK和Big5碼的轉化。如果想要將簡體中文轉化到Big5碼,可以通過“簡體中文GBK->繁體中文GBK->繁體Big5 ”的方式實現,第一步是GBK碼內的映射,第二步是兩種編碼間的轉化;反之亦然。