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

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

  我们平时常见的三种中文内码是: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:

 

  1. void BIG52GBK(char *szBuf)    
  2. {    
  3.   if(!strcmp(szBuf, ""))    
  4.    return;    
  5.   int nStrLen = strlen(szBuf);    
  6.   wchar_t *pws = new wchar_t[nStrLen + 1];    
  7.   try    
  8.   {    
  9.    int nReturn = MultiByteToWideChar(950, 0, szBuf, nStrLen, pws, nStrLen + 1);    
  10.    BOOL bValue = false;    
  11.    nReturn = WideCharToMultiByte(936, 0, pws, nReturn, szBuf, nStrLen + 1, "?", &bValue);    
  12.    szBuf[nReturn] = 0;    
  13.   }    
  14.   __finally    
  15.   {    
  16.    delete[] pws;    
  17.   }    
  18. }   

 

//---------------------------------------------------------------------------

// GBK => Big5

 

  1. void GBK2BIG5(char *szBuf)    
  2. {    
  3.   if(!strcmp(szBuf, ""))    
  4.    return ;    
  5.   int nStrLen = strlen(szBuf);    
  6.   wchar_t *pws = new wchar_t[nStrLen + 1];    
  7.   __try    
  8.   {    
  9.    MultiByteToWideChar(936, 0, szBuf, nStrLen, pws, nStrLen + 1);    
  10.    BOOL bValue = false;    
  11.    WideCharToMultiByte(950, 0, pws, nStrLen, szBuf, nStrLen + 1, "?", &bValue);    
  12.    szBuf[nStrLen] = 0;    
  13.   }    
  14.   __finally    
  15.   {    
  16.    delete[] pws;    
  17.   }    
  18. }   

 

//----------------------------------------------------------------------------

// GB2312 => GBK

 

  1. void GB2GBK(char *szBuf)    
  2. {    
  3.   if(!strcmp(szBuf, ""))    
  4.    return;    
  5.   int nStrLen = strlen(szBuf);    
  6.   WORD wLCID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_PRC);    
  7.   int nReturn = LCMapString(wLCID, LCMAP_TRADITIONAL_CHINESE, szBuf, nStrLen, NULL, 0);    
  8.   if(!nReturn)    
  9.    return;    
  10.   char *pcBuf = new char[nReturn + 1];    
  11.   __try    
  12.   {    
  13.    wLCID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_PRC);    
  14.    LCMapString(wLCID, LCMAP_TRADITIONAL_CHINESE, szBuf, nReturn, pcBuf, nReturn + 1);    
  15.    strncpy(szBuf, pcBuf, nReturn);    
  16.   }    
  17.   __finally    
  18.   {    
  19.    delete[] pcBuf;    
  20.   }    
  21. }   

 

//---------------------------------------------------------------------------

// GBK =〉GB2312

 

  1. void GBK2GB(char *szBuf)    
  2. {    
  3.   if(!strcmp(szBuf, ""))    
  4.    return;    
  5.   int nStrLen = strlen(szBuf);    
  6.   WORD wLCID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_BIG5);    
  7.   int nReturn = LCMapString(wLCID, LCMAP_SIMPLIFIED_CHINESE, szBuf, nStrLen, NULL, 0);    
  8.   if(!nReturn)    
  9.    return;    
  10.   char *pcBuf = new char[nReturn + 1];    
  11.   __try    
  12.   {    
  13.    wLCID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_CHINESE_BIG5);    
  14.    LCMapString(wLCID, LCMAP_SIMPLIFIED_CHINESE, szBuf, nReturn, pcBuf, nReturn + 1);    
  15.    strncpy(szBuf, pcBuf, nReturn);    
  16.   }    
  17.   __finally    
  18.   {    
  19.    delete []pcBuf;    
  20.   }    
  21. }   

 

// 调用示例

  1.   ......    
  2.   char sourceEncode[255];    
  3.   char szBuf[1024];    
  4.   // 从 GB2312 转到 GBK    
  5.   strcpy(szBuf, sourceEncode);    
  6.   GB2GBK(szBuf);    
  7.   // 从GB2312 转到 BIG5,通过 GBK 中转    
  8.   strcpy(szBuf, sourceEncode);    
  9.   GB2GBK(szBuf);    
  10.   GBK2BIG5(szBuf);    
  11.     
  12.   ......    
  13. }    
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值