簡體中文和繁體中文的轉換

目前,大陸地區常見的中文編碼有如下三種。
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相反。函數參數可參見msdnide

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便可,以下:打開「控制面板」->「區域和語言」
新建位圖圖像 (2)編碼

重啓計算機,臺灣地區系統默認使用Big5碼。若是剛纔把GBK->Big5的結果保存到txt中,這時會發現txt文檔中保存的「い瓣」變成了「中國」。在Big5編碼下,有些大陸的網頁可能會顯示亂碼,建議再改回原來的設置。
上述實現了繁體字GBK和Big5碼的轉化。若是想要將簡體中文轉化到Big5碼,能夠經過「簡體中文GBK->繁體中文GBK->繁體Big5 」的方式實現,第一步是GBK碼內的映射,第二步是兩種編碼間的轉化;反之亦然。spa

相關文章
相關標籤/搜索