三种常见中文内码的转换方法

我们平时常见的三种中文内码是: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. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值