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

......

}

VC中三种常见中文内码的转换方法(GB2312/GBK/BIG5)相关推荐

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

    我们平时常见的三种中文内码是:GB2312(简体中文).GBK.BIG5(繁体中文).网上有很多中文内码的专用转换工具.我们碰到由于内码不一致而导致的乱麻问题,用这些工具可以进行相互转换.但论坛里经常 ...

  2. c语言中文内码,C语言辅导:三种常见的中文内码的转换方法

    我们平时常见的三种中文内码是:GB2312(简体中文).GBK.BIG5(繁体中文).网上有很多中文内码的专用转换工具.我们碰到由于内码不一致而导致的乱麻问题,用这些工具可以进行相互转换.但论坛里经常 ...

  3. 用C语言实现常见的三种中文内码转换

    常见的中文内码一般有GB2312(简体中文),GBK和台湾那边用的BIG5(繁体中文),有时候看一些台湾编程论坛里的资料,都是乱码,如果在IE中浏览,则要求安装繁体字库的支持.网上也有很多中文内码的转 ...

  4. c语言字符的内码是怎么表示,用C语言实现常见的三种中文内码转换

    常见的中文内码一般有GB2312(简体中文),GBK和台湾那边用的BIG5(繁体中文),有时候看一些台湾编程论坛里的资料,都是乱码,如果在IE中浏览,则要求安装繁体字库的支持.网上也有很多中文内码的转 ...

  5. 常见的三种中文内码转换代码

    作者:ccrun    更新:2005-10-13    浏览:11660 常见的中文内码一般有GB2312(简体中文),GBK和台湾那边用的BIG5(繁体中文),有时候看一些台湾编程论坛里的资料,都 ...

  6. C++常见的三种中文内码转换代码

    常见的中文内码一般有GB2312(简体中文),GBK和台湾那边用的BIG5(繁体中文),有时候看一些台湾编程论坛里的资料,都是乱码,如果在IE中浏览,则要求安装繁体字库的支持.网上也有很多中文内码的转 ...

  7. Android应用开发中三种常见的图片压缩方法

    Android应用开发中三种常见的图片压缩方法,分别是:质量压缩法.比例压缩法(根据路径获取图片并压缩)和比例压缩法(根据Bitmap图片压缩). 一.质量压缩法private Bitmap comp ...

  8. 图像灰度化的三种常见方法源码

    图像灰度化是图像处理很基础的一部分,在这里给出图像灰度化的三种常见方法的M源码,以供大家参考~ 平均值法,最大值法,加权平均值法 function f=MyGrayProcessing(Img) [m ...

  9. qt中文转字节_QT字符编码转换,可用于中文内码传输

    串口.TCP.UDP传输中文字符时,先将字符串转内码.客户端接收到数据后,将内码转为字符串就OK了 QByteArray CommonFunction::strToInterCode(constQSt ...

最新文章

  1. 数据结构算法集---C++语言实现
  2. 【pycharm使用指南】pycharm 取消连按两下shift出现的全局搜索 | pycharm误触出搜索弹窗
  3. ofdm原理_什么是IQ调制,了解I/Q调制的基本原理及其主要特征 - 射频技术第2部分...
  4. CloudFoundry cf push命令报错误码223的解决方法
  5. spring 框架(一)
  6. java实现创建窗口
  7. 多叉树的前序遍历_多叉树的创建和遍历(为Trie树做准备)
  8. 产品运营:当你和上级发生争执你会怎么处理?
  9. 转帖:MySql日期格式化
  10. 网易云信 java demo_网易云信Web IM搭建(Demo)
  11. IOS根据经纬度算距离
  12. ajax标准完整写法
  13. h5策划书_DIYH5|3.12世界睡眠日H5策划方案
  14. hdwiki 编码规范
  15. MapReduce分片、分区、分组 傻傻分不清
  16. android2.2智能手机,Jelly 2:全球最小的Android 10 4G智能手机
  17. android慢快门相机,慢快门app-Slow Shutter Cam官网版(附教程)预约 _5577安卓网
  18. 未来5年IT产业及网络市场发展趋势分析
  19. 如何做一个“实用”的图像数据集
  20. 王半仙儿的日记-0001

热门文章

  1. 开发板——在X210开发板上进行裸机开发的流程
  2. 华盛证券软件测试工程师工资,【恒生电子工资】软件测试工程师待遇-看准网...
  3. Ubuntu 18.04 配置ibus中文拼音输入法
  4. 51单片机驱动ESP8266
  5. 图像处理算法python_图像处理——饱和度调整算法(python语言)
  6. Winform + Devexpress 实现看板效果
  7. 简易的java发邮件客户端
  8. antd Mobile Tabs 垂直布局 后台传入数据
  9. 智慧社区运维可视化管理平台主要有哪些功能?
  10. 无极符和鸿蒙符哪个好,无极仙途内丹属性哪个好? 单属性与双属性内丹对比详解...