三種常見中文內碼的轉換方法!(轉)
我們平時常見的三種中文內碼是: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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 幾種常見的JSP中文亂碼JS
- 代理IP常見的三種切換方式
- HTML轉換到PDF的三種方式HTML
- Spark中的三種隱式轉換Spark
- 分享三種jpg轉換成pdf格式的方法,每一種都好用
- IPv6轉換常見問題盤點(中科三方)
- JS中的資料型別轉換:String轉換成Number的3種方法JS資料型別
- 【java】int轉換成String的四種方法Java
- 中文轉換成html中的utf-8的方法例項程式碼HTML
- 得到內網域管理員的5種常見方法內網
- IPv6轉換常見問題盤點
- Python 編碼轉換與中文處理Python
- python hex轉ascii轉換Python程式碼的簡單方法PythonASCII
- c++中幾種常見的型別轉換。int與string的轉換,float與string的轉換以及string和long型別之間的相互轉換。to_string函式的實現和應用。C++型別函式
- 使用vue實現行列轉換的一種方法。Vue
- [轉載]HTTP四種常見的POST提交資料方式HTTP
- 如何將文字轉換為向量?(方法三)
- Java中將Excel轉換為JSON的兩種方法JavaExcelJSON
- heic轉換格式的兩種方法:你get到了嗎
- JS字串轉換為JSON的四種方法筆記字串JSON筆記
- 常見的五種三列布局
- [Python] 各種轉換Python
- iOS常見的幾種加密方法iOS加密
- 輪換代理的四種常見輪換規則
- Cacheable 類轉換異常
- 直播系統程式碼,三種常見的提示彈窗
- 【Java】【集合】collection介面常見方法、集合轉陣列toArray()、帶ALL的方法Java陣列
- 企業加快數字化轉型的三種方法
- 常見的三種反爬蟲措施爬蟲
- SAP系統中的內碼和外碼轉換 (WBS號)
- Ocelot中文文件-轉換ClaimsAI
- Ocelot中文文件-轉換HeadersHeader
- 編碼轉換
- 常見轉義符學習
- PDF轉PPT怎麼轉?好用的PDF轉換方法有哪些?
- 頁面內跳轉到相應位置的3種方法
- 5種常見的Python拼接字串方法!Python字串
- C++ 常型別轉換C++型別
- Python教程:Pandas資料轉換編碼的10種方式Python