当前位置: 首页 > article >正文

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

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

  我们平时常见的三种中文内码是: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. }    
 
http://www.lryc.cn/news/2416846.html

相关文章:

  • 如何捕获access violation异常
  • c3p0详细配置
  • 实例表现ibatis的基础用法(不断更新)
  • 为intellij idea添加YUI Compressor支持
  • 详细解释PHP中header
  • JavaScript的数组操作
  • 软件工程相关知识点
  • IIS启动不了解决方法
  • Java API 使用文档中文版下载
  • LangChain搭建Agent | 使用initialize_agent
  • Android学习笔记(十) 主题样式的设置
  • 渗透中寻找突破口的那些事
  • 解决QQ在线客服代码提示对方“QQ在线状态”服务尚未启用
  • VM12即VMware Workstation 12 序列号
  • linux修改vcf编码格式,飞翔vcf文件编码转换
  • [转]灰度共生矩阵(超简单理解)
  • web网页死链接检查工具——“Scrutiny 8”
  • 修改framework-res.apk的内容
  • u盘安装ubuntu 11.10的惨痛经历
  • webim--web端即时通讯的实现
  • 推荐两个软件下载网站:多特和绿盟
  • Spring源码中的工具类
  • python爬取discuz_爬虫技术实践(二)Discuz! 按板块爬取帖子内容实战
  • 一文看懂第三代E/E架构。
  • The world 浏览器 ,windows中的快捷操作
  • Response.Cookies和Request.Cookies的Cookies
  • 2014 360校园招聘技术类笔试题
  • 【Ubuntu安装QQ】
  • MikroTik RouterOS 5.x使用HunterTik 2.3.1进行破解
  • Android学习路线指南