三種常見中文內碼的轉換方法!(轉)
我們平時常見的三種中文內碼是:GB2312(簡體中文)、GBK、BIG5(繁體中文)。網上有很多中文內碼的專用轉換。我們碰到由於內碼不一致而導致的亂麻問題,用這些可以進行相互轉換。但論壇裡經常有人問如何在自己的程式中整合這些功能呢?本文將介紹如何利用 Windows 提供的API 函式來實現。轉換涉及到的 API 函式主要有兩個:MultiByteToWideChar 和 WideCharToMultiByte。有關這兩個函式的詳細文件請參考 MSDN,本文不再贅述。
本文將介紹四個轉換函式分別實現如下的轉換:
* Big5 => GBK
* GBK => Big5
* GB2312 => GBK
* GBK => GB2312
有關 GB2312 =〉BIG5 的轉換以及 BIG5 =〉GB2312 的轉換可以透過 GBK 間接實現。先將 GB2312 轉成 GBK,再將 GBK 轉成 BIG5,反之亦然。當然也可以自己實現它們之間的直接轉換。
// Big5 => GBK:
void BIG52GBK(char *szBuf)
{
if(!strcmp(szBuf, ""))
return;
int nStrLen = strlen(szBuf);
wchar_t *pws = new wchar_t[nStrLen + 1];
try
{
int nReturn = MultiByteToWideChar(950, 0, szBuf, nStrLen, pws, nStrLen + 1);
BOOL bValue = false;
nReturn = WideCharToMultiByte(936, 0, pws, nReturn, szBuf, nStrLen + 1, "?", &bValue);
szBuf[nReturn] = 0;
}
__finally
{
delete[] pws;
}
}
//---------------------------------------------------------------------------
// GBK => Big5
void GBK2BIG5(char *szBuf)
{
if(!strcmp(szBuf, ""))
return ;
int nStrLen = strlen(szBuf);
wchar_t *pws = new wchar_t[nStrLen + 1];
__try
{
MultiByteToWideChar(936, 0, szBuf, nStrLen, pws, nStrLen + 1);
BOOL bValue = false;
WideCharToMultiByte(950, 0, pws, nStrLen, szBuf, nStrLen + 1, "?", &bValue);
szBuf[nStrLen] = 0;
}
__finally
{
delete[] pws;
}
}
//----------------------------------------------------------------------------
// GB2312 => GBK
void GB2GBK(char *szBuf)
{
if(!strcmp(szBuf, ""))
return;
int nStrLen = strlen(szBuf);
WORD wLCID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_PRC);
int nReturn = LCMapString(wLCID, LCMAP_TRADITIONAL_CHINESE, szBuf, nStrLen, NULL, 0);
if(!nReturn)
return;
char *pcBuf = new char[nReturn + 1];
__try
{
wLCID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_PRC);
LCMapString(wLCID, LCMAP_TRADITIONAL_CHINESE, szBuf, nReturn, pcBuf, nReturn + 1);
strncpy(szBuf, pcBuf, nReturn);
}
__finally
{
delete[] pcBuf;
}
}
//---------------------------------------------------------------------------
// GBK =〉GB2312
void GBK2GB(char *szBuf)
{
if(!strcmp(szBuf, ""))
return;
int nStrLen = strlen(szBuf);
WORD wLCID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_BIG5);
int nReturn = LCMapString(wLCID, LCMAP_SIMPLIFIED_CHINESE, szBuf, nStrLen, NULL, 0);
if(!nReturn)
return;
char *pcBuf = new char[nReturn + 1];
__try
{
wLCID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_BIG5);
LCMapString(wLCID, LCMAP_SIMPLIFIED_CHINESE, szBuf, nReturn, pcBuf, nReturn + 1);
strncpy(szBuf, pcBuf, nReturn);
}
__finally
{
delete []pcBuf;
}
}
// 呼叫示例
......
char sourceEncode[255];
char szBuf[1024];
// 從 GB2312 轉到 GBK
strcpy(szBuf, sourceEncode);
GB2GBK(szBuf);
// 從GB2312 轉到 BIG5,透過 GBK 中轉
strcpy(szBuf, sourceEncode);
GB2GBK(szBuf);
GBK2BIG5(szBuf);
......
}[@more@]
本文將介紹四個轉換函式分別實現如下的轉換:
* Big5 => GBK
* GBK => Big5
* GB2312 => GBK
* GBK => GB2312
有關 GB2312 =〉BIG5 的轉換以及 BIG5 =〉GB2312 的轉換可以透過 GBK 間接實現。先將 GB2312 轉成 GBK,再將 GBK 轉成 BIG5,反之亦然。當然也可以自己實現它們之間的直接轉換。
// Big5 => GBK:
void BIG52GBK(char *szBuf)
{
if(!strcmp(szBuf, ""))
return;
int nStrLen = strlen(szBuf);
wchar_t *pws = new wchar_t[nStrLen + 1];
try
{
int nReturn = MultiByteToWideChar(950, 0, szBuf, nStrLen, pws, nStrLen + 1);
BOOL bValue = false;
nReturn = WideCharToMultiByte(936, 0, pws, nReturn, szBuf, nStrLen + 1, "?", &bValue);
szBuf[nReturn] = 0;
}
__finally
{
delete[] pws;
}
}
//---------------------------------------------------------------------------
// GBK => Big5
void GBK2BIG5(char *szBuf)
{
if(!strcmp(szBuf, ""))
return ;
int nStrLen = strlen(szBuf);
wchar_t *pws = new wchar_t[nStrLen + 1];
__try
{
MultiByteToWideChar(936, 0, szBuf, nStrLen, pws, nStrLen + 1);
BOOL bValue = false;
WideCharToMultiByte(950, 0, pws, nStrLen, szBuf, nStrLen + 1, "?", &bValue);
szBuf[nStrLen] = 0;
}
__finally
{
delete[] pws;
}
}
//----------------------------------------------------------------------------
// GB2312 => GBK
void GB2GBK(char *szBuf)
{
if(!strcmp(szBuf, ""))
return;
int nStrLen = strlen(szBuf);
WORD wLCID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_PRC);
int nReturn = LCMapString(wLCID, LCMAP_TRADITIONAL_CHINESE, szBuf, nStrLen, NULL, 0);
if(!nReturn)
return;
char *pcBuf = new char[nReturn + 1];
__try
{
wLCID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_PRC);
LCMapString(wLCID, LCMAP_TRADITIONAL_CHINESE, szBuf, nReturn, pcBuf, nReturn + 1);
strncpy(szBuf, pcBuf, nReturn);
}
__finally
{
delete[] pcBuf;
}
}
//---------------------------------------------------------------------------
// GBK =〉GB2312
void GBK2GB(char *szBuf)
{
if(!strcmp(szBuf, ""))
return;
int nStrLen = strlen(szBuf);
WORD wLCID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_BIG5);
int nReturn = LCMapString(wLCID, LCMAP_SIMPLIFIED_CHINESE, szBuf, nStrLen, NULL, 0);
if(!nReturn)
return;
char *pcBuf = new char[nReturn + 1];
__try
{
wLCID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_BIG5);
LCMapString(wLCID, LCMAP_SIMPLIFIED_CHINESE, szBuf, nReturn, pcBuf, nReturn + 1);
strncpy(szBuf, pcBuf, nReturn);
}
__finally
{
delete []pcBuf;
}
}
// 呼叫示例
......
char sourceEncode[255];
char szBuf[1024];
// 從 GB2312 轉到 GBK
strcpy(szBuf, sourceEncode);
GB2GBK(szBuf);
// 從GB2312 轉到 BIG5,透過 GBK 中轉
strcpy(szBuf, sourceEncode);
GB2GBK(szBuf);
GBK2BIG5(szBuf);
......
}[@more@]
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10172717/viewspace-928849/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 用C語言實現常見的三種中文內碼轉換(轉)C語言
- 代理IP常見的三種切換方式
- 幾種常見的JSP中文亂碼JS
- java的中文亂碼轉換Java
- 內碼轉換技術 (轉)
- Linux中文字型的轉換與內嵌(轉)Linux
- Java 中日期的幾種常見操作 —— 取值、轉換、加減、比較Java
- JAVA常見中文問題的解決方案(轉)Java
- 得到內網域管理員的5種常見方法內網
- 分享三種jpg轉換成pdf格式的方法,每一種都好用
- Spark中的三種隱式轉換Spark
- HTML轉換到PDF的三種方式HTML
- 【轉】Java 列舉7常見種用法Java
- IPv6轉換常見問題盤點(中科三方)
- 幾種常見的濾波演算法(轉)演算法
- 三種禁用FileSystemObject元件的方法 (轉)Object元件
- windows 7常見的三種字型問題的解決方法Windows
- 竊取郵件內容 破解Email賬號的三種方法(轉)AI
- Drawable轉換為Bitmap兩種方法
- 中文轉換成html中的utf-8的方法例項程式碼HTML
- iOS常見的幾種加密方法iOS加密
- 三種Ext提交資料的方法(轉)
- 輪換代理的四種常見輪換規則
- IPv6轉換常見問題盤點
- 直播系統程式碼,三種常見的提示彈窗
- 中文內碼轉換巨匠1.2【VB簡單】註冊演算法演算法
- 常見物件-StringBuffer和String的相互轉換物件
- 常見的三種反爬蟲措施爬蟲
- PHP中資料型別轉換的三種方式PHP資料型別
- 強力破解E-mail密碼三種方法(轉)AI密碼
- [轉載]HTTP四種常見的POST提交資料方式HTTP
- Solaris 常見問題及解決方法(轉)
- 常見的80004005錯誤及其解決方法 (轉)
- 三種專案成本估算方法(轉)
- JS中的資料型別轉換:String轉換成Number的3種方法JS資料型別
- javascript字元編碼轉換方法JavaScript字元
- python unicode轉中文及轉換預設編碼PythonUnicode
- 使用vue實現行列轉換的一種方法。Vue