用C語言實現常見的三種中文內碼轉換(轉)
用C語言實現常見的三種中文內碼轉換(轉)[@more@]常見的中文內碼一般有GB2312(簡體中文),GBK和臺灣那邊用的BIG5(繁體中文),有時候看一些臺灣程式設計論壇裡的資料,都是亂碼,如果在IE中瀏覽,則要求安裝繁體字型檔的支援。網上也有很多中文內碼的轉換工具,但是在自己的程式中整合這些功能豈不是更好。Windows中提供了MultiByteToWideChar和WideCharToMultiByte兩兄弟函式,足可以搞定這些功能了。
以下四個函式分別實現:
大五碼轉GBK碼/GBK轉大五碼
GB2312碼轉GBK碼/GBK碼轉GB2312碼
於是有人要問了,為什麼沒有GB2312轉BIG5和BIG5轉GB2312呢,我們有GBK,可以做一下中轉啊。可以將GB2312轉成GBK,再將GBK轉成BIG5,反之亦然。如果你嫌麻煩,可以自己寫一個GB2BIG5/BIG52GB。
//---------------------------------------------------------------------------
// 大五碼轉GBK碼:
// い地?チ?㎝瓣 --> 中華人民共和國
void __fastcall 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轉大五碼
// 中華人民共和國 --> い地?チ?㎝瓣
void __fastcall 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 __fastcall 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 __fastcall 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;
}
}
//---------------------------------------------------------------------------
// 測試程式碼
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char szBuf[255];
// 從GB2312轉到GBK
strcpy(szBuf, Edit1->Text.c_str());
GB2GBK(szBuf);
Edit2->Text = String(szBuf);
// 從GB2312轉到BIG5,透過GBK中轉
strcpy(szBuf, Edit1->Text.c_str());
GB2GBK(szBuf);
GBK2BIG5(szBuf);
Edit3->Text = String(szBuf);
}
注意,請不要使用String類的c_str()作為上述幾個函式的傳入引數。
以下四個函式分別實現:
大五碼轉GBK碼/GBK轉大五碼
GB2312碼轉GBK碼/GBK碼轉GB2312碼
於是有人要問了,為什麼沒有GB2312轉BIG5和BIG5轉GB2312呢,我們有GBK,可以做一下中轉啊。可以將GB2312轉成GBK,再將GBK轉成BIG5,反之亦然。如果你嫌麻煩,可以自己寫一個GB2BIG5/BIG52GB。
//---------------------------------------------------------------------------
// 大五碼轉GBK碼:
// い地?チ?㎝瓣 --> 中華人民共和國
void __fastcall 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轉大五碼
// 中華人民共和國 --> い地?チ?㎝瓣
void __fastcall 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 __fastcall 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 __fastcall 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;
}
}
//---------------------------------------------------------------------------
// 測試程式碼
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char szBuf[255];
// 從GB2312轉到GBK
strcpy(szBuf, Edit1->Text.c_str());
GB2GBK(szBuf);
Edit2->Text = String(szBuf);
// 從GB2312轉到BIG5,透過GBK中轉
strcpy(szBuf, Edit1->Text.c_str());
GB2GBK(szBuf);
GBK2BIG5(szBuf);
Edit3->Text = String(szBuf);
}
注意,請不要使用String類的c_str()作為上述幾個函式的傳入引數。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-957392/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 三種常見中文內碼的轉換方法!(轉)
- C 語言常見問題(轉)
- C語言常見的出錯資訊! (轉)C語言
- C語言常見錯誤分析 (轉)C語言
- 用abap實現內表的行列轉換-原始碼2 (轉)原始碼
- C語言---整型字串轉換C語言字串
- C語言,實現數字譜到簡譜的轉換(二)C語言
- c語言字串,數字轉換C語言字串
- C語言的隱式型別轉換C語言型別
- 對JAVA語言的十個常見誤解(轉)Java
- 用 Java 實現常見的 8 種內部排序演算法Java排序演算法
- 【資料結構】用C語言實現單連結串列及其常見操作資料結構C語言
- 作業系統:程式狀態轉換模擬,C語言實現作業系統C語言
- c++中幾種常見的型別轉換。int與string的轉換,float與string的轉換以及string和long型別之間的相互轉換。to_string函式的實現和應用。C++型別函式
- C++語言常見問題解答(3) (轉)
- C++語言常見問題解答(1) (轉)
- 三種語言實現快速排序(C++/Python/Java)排序C++PythonJava
- 三種語言實現差分(C++/Python/Java)C++PythonJava
- C語言“字串-數字”之間的轉換C語言字串
- 代理IP常見的三種切換方式
- Yuv420轉Jpeg(C語言實現)C語言
- 用XML實現程式語言間的互譯 (轉)XML
- C語言進位制轉換與列印C語言
- 使用C#實現阿拉伯數字到大寫中文的轉換 (轉)C#
- 位反轉的最佳演算法(C語言實現)演算法C語言
- 幾種常見的JSP中文亂碼JS
- 用Flex實現常見的幾種佈局Flex
- 用C語言實現八數碼問題C語言
- Java語言和C++語言的差異——老生常談 (轉)JavaC++
- 三種語言實現歸併排序(C++/Python/Java)排序C++PythonJava
- 用C語言編寫Linux實用程式的藝術(轉)C語言Linux
- 七種常見的陣列排序演算法整理(C語言版本)陣列排序演算法C語言
- C語言異常與斷言介面的實現C語言
- C語言常見使用問題2C語言
- C語言指標常見問題C語言指標
- 4- C語言常見錯誤C語言
- java的中文亂碼轉換Java
- SAP OTR語言轉換R語言