通行证: 用户 密码 网站建设  下载中心 社区论坛 信息公告 MY小屋
联系我们
设为首页
加入收藏

 

QQ,ASP,PHP,JSP,XML,SQL,.Net,编程 程序 网页图象 建站经验 私服
首页 | 新闻资讯 | 编程开发 | 网页设计 | 图形图象 | 网络媒体 | 网站模板 | 数 据 库 | 投稿
论坛 | 操作系统 | 系统优化 | 网络安全 | 黑客技术 | 硬件学堂 | 硬件报价 | 服 务 器 | 地图
专题 | 应用软件 | 聊天通讯 | Q Q 专栏 | 建站经验 | 在线工具 | 站长Club | 注 册 表 | 旧版
社会 | 游戏娱乐 | 设计欣赏 | 疑难解答 | 社区论坛 | 韩国素材 | 素材图库 | 广告服务 | 服务
当前位置:首页>>编程开发>>C#语言>>正文 新版上线![旧版]
注:打开慢时请稍等

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

http://www.iyit.net  日期:2006-12-5 0:03:57  来源:iyit.net  点击:
参加讨论】 我们平时常见的三种中文内码是: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);

......

}

编辑:iyit.net [发送给好友] [打印本页] [关闭窗口] [返回顶部]
上一篇:从任务通知区启动屏幕保护程序
下一篇:没有了
转载请注明来源:www.iyit.net
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。

 相关文章
从任务通知区启动屏幕保护程序 用Visual Basic制作安装程序 探索VB系列中的事件处理的奥秘
VB.NET注册表编程 在VB中使用注册表 用VB函数轻松访问系统注册表
在VB中调用API操作注册表 VB4.0对注册表操作的命令 asp.net中的vb7中如何调用dll中的函数
asp.net中的vb7中如何使用socket作一个 在ASP.NET中处理 datetime 的一些通用函 在ASP.NET中操作文件的例子(VB)
在ASP.NET中处理datetime的一些通用函数 VB.NET多线程开发实例 多线程填写treeview控件(vb.net)
vb.net的windows窗体实现dos命令  一个用Wsh来控制SqlServer的Dcom的VBs 和我一起入门Direct3D的VB.net编程
VB.NET如何在没有.NET框架的机器上运行 LCS问题算法之VB.net版 VB.net 调用带参数存储过程
vb.net 中实现画图 在VB.Net中创建使用控件数组 VB6 中 善用 ByRef 提升速度
最新更新 热点排行 推荐新闻
三种常见中文内码的转换方法!
从任务通知区启动屏幕保护程序
C#中如何插入照片到Excel
用C#把文件转换为XML
写好C程序的秘籍(强!)
三种常见中文内码的转换方法!
Google.COM在京瘫痪 疑是服务器不稳定
Google拟投资迅雷估值1亿美金
msn8.0下载、msn shell、msn8.0中文版
 China.travel 中国旅游网启动 travel
专家指点注册.mobi手机域名注意事项 
Windows Vista 5840简体中文版体验心得
微软三大商务引擎11月30日齐“亮相”
微软正式发布Vista操作系统(图)
页面控制常见问题及解决办法 
用C#把文件转换为XML
C#中如何插入照片到Excel
从任务通知区启动屏幕保护程序
C++程序设计最佳实践
写好C程序的秘籍(强!)
最新永久免费网游年列表,免费3d网游
破解QQ密码如此简单 
永久免费网游《刀OL》11月3日开放新服
远程破解盗窃QQ密码的各种方法
Windows的右键菜单设置与应用技巧
破解Windows密码如此简单!
三分钟让你的系统变处女:Acronis Tru
安装IE7.0密技 绕过WGA 完美轻松搞定
windows下如何修改右键菜单
流氓软件清理助手下载
三种常见中文内码的转换方法!
从任务通知区启动屏幕保护程序
三种常见中文内码的转换方法!
Windows Vista 5840简体中文版体验心得
电脑主板知识大全图文版 
BIOS中英文对照 
Q币游戏币互换将被禁止 腾讯为防止网民
网页特效制作专家 v11.99 下载
Photoshop 有关通道 
Photoshop 颜色理论 
用Dreamweaver8搞定web标准
qmail+vpopmail+sqwebmail的安装步骤

设置首 页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyrights © 2004-2006 iYiT.Net All Rights Reserved.
网站合作、广告联系QQ:147007642、466949678
易特网络技术 点击这里给我发消息