目前,大陸地區常見的中文編碼有如下三種。
GB2312
GB2312(1980年)一共收錄了7445個字符,包括6763個漢字和682個其它符號。漢字區的內碼範圍高字節從B0-F7,低字節從A1-FE,佔用的碼位是72*94=6768。其中有5個空位是D7FA-D7FE。在windows中的代碼頁是CP936。
GBK
GBK最初是由微軟對GB2312的擴展,也就是CP936字碼表 (Code Page 936)的擴展。最初出現於Windows 95簡體中文版中,因爲Windows產品的流行和在大陸普遍被使用,中華人民共和國國家有關部門將其做爲技術規範。注意GBK並不是國家正式標準,只是國家技術監督局標準化司、電子工業部科技與質量監督司發佈的「技術規範指導性文件」。GBK字集是簡繁字集,包括了GB字集、BIG5字集和一些符號,共包括21003個字符。
GBK做爲對GB2312的擴展,在如今的windows系統中仍然使用代碼頁CP936表示,可是一樣的936的代碼頁跟一開始的936的代碼頁只支持GB2312編碼不一樣,如今的936代碼頁支持GBK的編碼,GBK同時也向下兼容GB2312編碼。
GB18030
2000年的GB18030是取代GBK1.0的正式國家標準。該標準收錄了27484個漢字,收錄了藏文、蒙文、維吾爾文等主要的少數民族文字。如今的PC平臺必須支持GB18030,對嵌入式產品暫不做要求。因此手機、MP3通常只支持GB2312。 GB18030在windows中的代碼頁是CP54936。html
1.簡體中文和繁體中文的轉換ios
內碼通常是指缺省代碼頁指定的編碼,缺省代碼頁是默認用來解釋字符的編碼。簡體中文windows系統缺省代碼頁是GBK。
ANSI編碼:即全部在ASCII基礎上擴充的字符編碼的統稱。在英文操做系統中ANSI是ASCII編碼,繁體中文系統中ANSI是Big5編碼,日文系統中ANSI是Shift_JIS編碼,簡體中文系統有點特殊,好比:editplus或記事本的默認編碼爲ANSI,但具體ANSI表明的是gbk仍是gb2312仍是gb18030,由這些編輯器根據碼流去識別。window下不少文本編輯器都沒有強行採用某種特定的編碼,統一使用系統編碼,因此中文win系統中ANSI就是GBK。
windows
GBK字符集包括了簡體字符集、繁體字符集以及一些中文符號,固然同一漢字簡繁字體在GBK下對應兩種不一樣編碼方式。能夠,在ANSI編碼下的簡繁轉化實質是在GBK編碼表內的映射轉化。
window頭文件中提供了LCMapString function能夠實現映射功能,程序以下 編輯器
/* *做者:侯凱 *說明:中文簡繁的相互轉化 *日期:2013-6-18 */ #include <Windows.h> #include <iostream> using namespace std; //中國->中國 char* Simple2Tra(char* szBuf) { if(!strcmp(szBuf, "")) return NULL; int nReturn = LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_TRADITIONAL_CHINESE, szBuf, -1, NULL, 0); char *pcBuf = new char[nReturn]; LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_TRADITIONAL_CHINESE, szBuf, -1, pcBuf, nReturn); return pcBuf; } //中國->中國 char* Tra2Simple(char* szBuf) { if(!strcmp(szBuf, "")) return NULL; int nReturn = LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_SIMPLIFIED_CHINESE, szBuf, -1, NULL, 0); char *pcBuf = new char[nReturn]; LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_SIMPLIFIED_CHINESE, szBuf, nReturn, pcBuf, nReturn); return pcBuf; } void main() { char* simWord = "中國"; char* traWord = Simple2Tra(simWord); cout << simWord << "->" << traWord << endl; char* simWord2 = Tra2Simple(traWord); cout << traWord << "->" << simWord2 << endl; }
LCMAP_SIMPLIFIED_CHINESE表示traditional Chinese字符集到simplified Chinese字符集的映射,LCMAP_TRADITIONAL_CHINESE相反。函數參數可參見msdn。ide
2.簡體中文和繁體中文(Big5)的轉換函數
大多數狀況下簡繁的轉化是GBK字符集內部的相互映射,可是有時咱們會碰到另外一種常見的繁體編碼:「大五碼」。Big5碼是一套雙字節字符集,BIG5碼是通行於臺灣、香港地區的一個繁體字編碼方案,其對應代碼頁爲950。首先來看繁體Big5與繁體GBK編碼的相互轉化,它們兩者經過Unicode字符集相關聯,Big5<—>Unicode<—>GBK,相似思想可參見此文,程序實現以下字體
//中國->い瓣 //繁體GBK轉Big5碼 char* GBK2BIG5(char* szBuf) { int wcsLen = ::MultiByteToWideChar(CP_ACP, NULL, szBuf, -1, NULL, 0); wchar_t* wszString = new wchar_t[wcsLen]; ::MultiByteToWideChar(CP_ACP, NULL, szBuf, -1, wszString, wcsLen); //CP_ACP本地編碼(GBK)對應代碼頁 int ansiLen = ::WideCharToMultiByte(950, NULL, wszString, -1, NULL, 0, NULL, NULL); char* szAnsi = new char[ansiLen]; ::WideCharToMultiByte(950, NULL, wszString, -1, szAnsi, ansiLen, NULL, NULL); //Big5對應代碼頁 delete[] wszString; return szAnsi; } //い瓣->中國 //Big5碼轉繁體GBK char* BIG52GBK(char* szBuf) { int wcsLen = ::MultiByteToWideChar(950, NULL, szBuf, -1, NULL, 0); wchar_t* wszString = new wchar_t[wcsLen]; ::MultiByteToWideChar(950, NULL, szBuf, -1, wszString, wcsLen); //Big5對應代碼頁 int ansiLen = ::WideCharToMultiByte(CP_ACP, NULL, wszString, -1, NULL, 0, NULL, NULL); char* szAnsi = new char[ansiLen]; ::WideCharToMultiByte(CP_ACP, NULL, wszString, -1, szAnsi, ansiLen, NULL, NULL); //CP_ACP本地編碼(GBK)對應代碼頁 delete[] wszString; return szAnsi; }
上述程序實現了繁體字下GBK和Big5碼的相互轉化,因爲簡體中文操做系統中ANSI默認是GBK編碼,「中國」二字轉碼爲Big5碼後,系統仍然按照GBK編碼進行解析後顯示,這樣勢必是亂碼的。若是想要獲得Big5編碼下的正確顯示,能夠更改系統的語言,將Big5做爲其默認ANSI便可,以下:打開「控制面板」->「區域和語言」
編碼
重啓計算機,臺灣地區系統默認使用Big5碼。若是剛纔把GBK->Big5的結果保存到txt中,這時會發現txt文檔中保存的「い瓣」變成了「中國」。在Big5編碼下,有些大陸的網頁可能會顯示亂碼,建議再改回原來的設置。
上述實現了繁體字GBK和Big5碼的轉化。若是想要將簡體中文轉化到Big5碼,能夠經過「簡體中文GBK->繁體中文GBK->繁體Big5 」的方式實現,第一步是GBK碼內的映射,第二步是兩種編碼間的轉化;反之亦然。spa