我们平时常见的三种中文内码是: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,反之亦然。当然也可以自己实现它们之间的直接转换。
001.
// Big5 => GBK:
002.
// い地チ㎝瓣 --> 中華人民共和國
003.
void
BIG52GBK(
char
*szBuf)
004.
{
005.
if
(!
strcmp
(szBuf,
""
))
006.
return
;
007.
int
nStrLen =
strlen
(szBuf);
008.
wchar_t
*pws =
new
wchar_t
[nStrLen + 1];
009.
try
010.
{
011.
int
nReturn = MultiByteToWideChar(950, 0, szBuf, nStrLen, pws, nStrLen + 1);
012.
BOOL
bValue =
false
;
013.
nReturn = WideCharToMultiByte(936, 0, pws, nReturn, szBuf, nStrLen + 1,
"?"
, &bValue);
014.
szBuf[nReturn] = 0;
015.
}
016.
__finally
017.
{
018.
delete
[] pws;
019.
}
020.
}
021.
//---------------------------------------------------------------------------
022.
// GBK => Big5 // 中華人民共和國 --> い地チ㎝瓣
023.
void
GBK2BIG5(
char
*szBuf)
024.
{
025.
if
(!
strcmp
(szBuf,
""
))
026.
return
;
027.
int
nStrLen =
strlen
(szBuf);
028.
wchar_t
*pws =
new
wchar_t
[nStrLen + 1];
029.
__try
030.
{
031.
MultiByteToWideChar(936, 0, szBuf, nStrLen, pws, nStrLen + 1);
032.
BOOL
bValue =
false
;
033.
WideCharToMultiByte(950, 0, pws, nStrLen, szBuf, nStrLen + 1,
"?"
, &bValue);
034.
szBuf[nStrLen] = 0;
035.
}
036.
__finally
037.
{
038.
delete
[] pws;
039.
}
040.
}
041.
//----------------------------------------------------------------------------
042.
// GB2312 => GBK // 中华人民共和国 --> 中華人民共和國
043.
void
GB2GBK(
char
*szBuf)
044.
{
045.
if
(!
strcmp
(szBuf,
""
))
046.
return
;
047.
int
nStrLen =
strlen
(szBuf);
048.
WORD
wLCID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_PRC);
049.
int
nReturn = LCMapString(wLCID, LCMAP_TRADITIONAL_CHINESE, szBuf, nStrLen, NULL, 0);
050.
if
(!nReturn)
051.
return
;
052.
char
*pcBuf =
new
char
[nReturn + 1];
053.
__try
054.
{
055.
wLCID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_PRC);
056.
LCMapString(wLCID, LCMAP_TRADITIONAL_CHINESE, szBuf, nReturn, pcBuf, nReturn + 1);
057.
strncpy
(szBuf, pcBuf, nReturn);
058.
}
059.
__finally
060.
{
061.
delete
[] pcBuf;
062.
}
063.
}
064.
//---------------------------------------------------------------------------
065.
// GBK =〉GB2312 // 中華人民共和國 --> 中华人民共和国
066.
void
GBK2GB(
char
*szBuf)
067.
{
068.
if
(!
strcmp
(szBuf,
""
))
069.
return
;
070.
int
nStrLen =
strlen
(szBuf);
071.
WORD
wLCID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_BIG5);
072.
int
nReturn = LCMapString(wLCID, LCMAP_SIMPLIFIED_CHINESE, szBuf, nStrLen, NULL, 0);
073.
if
(!nReturn)
074.
return
;
075.
char
*pcBuf =
new
char
[nReturn + 1];
076.
__try
077.
{
078.
wLCID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_BIG5);
079.
LCMapString(wLCID, LCMAP_SIMPLIFIED_CHINESE, szBuf, nReturn, pcBuf, nReturn + 1);
080.
strncpy
(szBuf, pcBuf, nReturn);
081.
}
082.
__finally
083.
{
084.
delete
[]pcBuf;
085.
}
086.
}
087.
088.
// 调用示例
089.
090.
......
091.
我们平时常见的三种中文内码是: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,反之亦然。当然也可以自己实现它们之间的直接转换。
001.
// Big5 => GBK:
002.
// い地チ㎝瓣 --> 中華人民共和國
003.
void
BIG52GBK(
char
*szBuf)
004.
{
005.
if
(!
strcmp
(szBuf,
""
))
006.
return
;
007.
int
nStrLen =
strlen
(szBuf);
008.
wchar_t
*pws =
new
wchar_t
[nStrLen + 1];
009.
try
010.
{
011.
int
nReturn = MultiByteToWideChar(950, 0, szBuf, nStrLen, pws, nStrLen + 1);
012.
BOOL
bValue =
false
;
013.
nReturn = WideCharToMultiByte(936, 0, pws, nReturn, szBuf, nStrLen + 1,
"?"
, &bValue);
014.
szBuf[nReturn] = 0;
015.
}
016.
__finally
017.
{
018.
delete
[] pws;
019.
}
020.
}
021.
//---------------------------------------------------------------------------
022.
// GBK => Big5 // 中華人民共和國 --> い地チ㎝瓣
023.
void
GBK2BIG5(
char
*szBuf)
024.
{
025.
if
(!
strcmp
(szBuf,
""
))
026.
return
;
027.
int
nStrLen =
strlen
(szBuf);
028.
wchar_t
*pws =
new
wchar_t
[nStrLen + 1];
029.
__try
030.
{
031.
MultiByteToWideChar(936, 0, szBuf, nStrLen, pws, nStrLen + 1);
032.
BOOL
bValue =
false
;
033.
WideCharToMultiByte(950, 0, pws, nStrLen, szBuf, nStrLen + 1,
"?"
, &bValue);
034.
szBuf[nStrLen] = 0;
035.
}
036.
__finally
037.
{
038.
delete
[] pws;
039.
}
040.
}
041.
//----------------------------------------------------------------------------
042.
// GB2312 => GBK // 中华人民共和国 --> 中華人民共和國
043.
void
GB2GBK(
char
*szBuf)
044.
{
045.
if
(!
strcmp
(szBuf,
""
))
046.
return
;
047.
int
nStrLen =
strlen
(szBuf);
048.
WORD
wLCID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_PRC);
049.
int
nReturn = LCMapString(wLCID, LCMAP_TRADITIONAL_CHINESE, szBuf, nStrLen, NULL, 0);
050.
if
(!nReturn)
051.
return
;
052.
char
*pcBuf =
new
char
[nReturn + 1];
053.
__try
054.
{
055.
wLCID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_PRC);
056.
LCMapString(wLCID, LCMAP_TRADITIONAL_CHINESE, szBuf, nReturn, pcBuf, nReturn + 1);
057.
strncpy
(szBuf, pcBuf, nReturn);
058.
}
059.
__finally
060.
{
061.
delete
[] pcBuf;
062.
}
063.
}
064.
//---------------------------------------------------------------------------
065.
// GBK =〉GB2312 // 中華人民共和國 --> 中华人民共和国
066.
void
GBK2GB(
char
*szBuf)
067.
{
068.
if
(!
strcmp
(szBuf,
""
))
069.
return
;
070.
int
nStrLen =
strlen
(szBuf);
071.
WORD
wLCID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_BIG5);
072.
int
nReturn = LCMapString(wLCID, LCMAP_SIMPLIFIED_CHINESE, szBuf, nStrLen, NULL, 0);
073.
if
(!nReturn)
074.
return
;
075.
char
*pcBuf =
new
char
[nReturn + 1];
076.
__try
077.
{
078.
wLCID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_BIG5);
079.
LCMapString(wLCID, LCMAP_SIMPLIFIED_CHINESE, szBuf, nReturn, pcBuf, nReturn + 1);
080.
strncpy
(szBuf, pcBuf, nReturn);
081.
}
082.
__finally
083.
{
084.
delete
[]pcBuf;
085.
}
086.
}
087.
088.
// 调用示例
089.
090.
......
091.
092.
char
sourceEncode[255];
093.
char
szBuf[1024];
094.
095.
// 从 GB2312 转到 GBK
096.
strcpy
(szBuf, sourceEncode);
097.
GB2GBK(szBuf);
098.
099.
// 从GB2312 转到 BIG5,通过 GBK 中转
100.
strcpy
(szBuf, sourceEncode);
101.
GB2GBK(szBuf);
102.
GBK2BIG5(szBuf);
103.
104.
......
105.
106.
}
092.
char
sourceEncode[255];
093.
char
szBuf[1024];
094.
095.
// 从 GB2312 转到 GBK
096.
strcpy
(szBuf, sourceEncode);
097.
GB2GBK(szBuf);
098.
099.
// 从GB2312 转到 BIG5,通过 GBK 中转
100.
strcpy
(szBuf, sourceEncode);
101.
GB2GBK(szBuf);
102.
GBK2BIG5(szBuf);
103.
104.
......
105.
106.
}