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

}

C++内码转换的三种方法相关推荐

  1. c语言位操作大小写转换,C语言实现大小写转换的三种方法

    今天心血来潮,总结了下大小写转换的方法,大致有三种. 1.使用C语言提供的函数:toupper(),tolower() 使用这两个函数需要引入头文件:#include 示例代码: #include # ...

  2. c语言中文如何大小写转换器,C语言实现大小写转换的三种方法

    今天心血来潮,总结了下大小写转换的方法,大致有三种. 1.使用C语言提供的函数:toupper(),tolower() 使用这两个函数需要引入头文件:#include 示例代码: #include # ...

  3. string和wstring之间转换的三种方法

    方法1 #include <string> #include <locale> #include <codecvt>//convert string to wstr ...

  4. Excel常用技巧—数字和文本转换,三种方法任你选!!

    Excel图表系列: Excel数据分析常用函数①--查询函数 Excel数据分析常用函数②--统计函数 Excel数据分析常用函数③--字符串函数 Excel数据分析常用函数④--日期函数 Exce ...

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

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

  6. Java中将对象转换成String的三种方法

    日常开发中经常会有对象转成String类型这种场景,一般有三种方法 1.直接进行类型强转,(String) Object o = "2"; System.out.println(( ...

  7. WPS如何转换成图片?三种方法帮你实现

    WPS如何转换成图片?三种方法帮你轻松实现!在大学中,大家完成老师布置的专业课作业都是通过使用电脑中的WPS制作完成.为了防止自己的作业遭到其他同学的私自窜改或是复制粘贴的抄袭.有的同学就会将自己的作 ...

  8. Nginx/Openresty日志时间显示到毫秒级的三种方法(不改源码)

    Nginx/Openresty日志时间显示到毫秒级的三种方法(不改源码) 方法一 :set (只能在server节点内) 方法二: set_by_lua (只能在server节点内) 方法三: map ...

  9. PHP开发日志 ━━ php、javascript生成二维码的三种方法

    最简单最实例的goolge开源方法 推荐手册:php完全自学手册 1.google开放api 代码如下: $urlToEncode="http://www.helloweba.com&quo ...

最新文章

  1. Hadoop之 MapReducer工作过程
  2. httpsrequest java_java 发送http和https请求的实例
  3. winform绑定多张图片
  4. 学习 | egg.js 从入门到精通
  5. 错过血亏!深入学习Redis集群搭建方案及实现原理
  6. 元数据 数据元 释义
  7. 微信支付宝刷步数_一劳永逸版(在用)
  8. 笔记19-字节缓冲流字符流
  9. 二级渠道分销系统开发适合什么样的产品?
  10. Android SELinux开发入门指南之如何增加Java Binder Service权限
  11. 冒泡排序(C语言版)
  12. 访客模式 无痕模式 区别_访客设计模式示例
  13. AIO,BIO,NIO详解
  14. vue 中 mixins 的使用
  15. 放大镜 讲课_放大镜说课稿
  16. 软考中项:常考知识点及案例分析要点总结
  17. linux 能打开exe文件,linux能运行exe文件吗
  18. 斗地主陪练机器人出牌算法使用说明
  19. cesium切片底图正常出来但控制台一直报错的方法
  20. Poco的介绍和入门教学

热门文章

  1. 矩阵正定 matlab,matlab 错误使用 chol 矩阵必须为正定矩阵
  2. RxJava过滤操作符 debounce
  3. xshell基础使用命令
  4. 硬中断、软中断、中断上半部、中断下半部
  5. python数据域宽左对齐_Python语言及其运用_第七章_像高手一样玩转数据
  6. h5打开麦克风权限录音_h5打开麦克风权限录音_原来电脑上自带录音功能,很多人还不知道,真的太实用了......
  7. jQuery中ajax跨域请求
  8. Altium Designer 18 原理图编译出现off grid错误处理方法
  9. 用无线插板控制RC(远程遥控)小车
  10. 缓解 WPF 应用程序中的空域问题