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

2016-01-29 12:17 79 1 收藏

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

【 tulaoshi.com - C语言心得技巧 】

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

作者:Samoo


  我们平时常见的三种中文内码是:GB2312(简体中文)、GBK、BIG5(繁体中文)。网上有很多中文内码的专用转换工具。我们碰到由于内码不一致而导致的乱麻问题,用这些工具可以进行相互转换。但论坛里经常有人问如何在自己的程序中集成这些功能呢?本文将介绍如何利用 Windows 提供的API 函数来实现。转换涉及到的 API 函数主要有两个:MultiByteToWideChar 和 WideCharToMultiByte。有关这两个函数的详细文档请参考 MSDN,本文不再赘述。

本文将介绍四个转换函数分别实现如下的转换:

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)Big5 = GBK GBK = Big5GB2312 = 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);      ......}


(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)

来源:http://www.tulaoshi.com/n/20160129/1485433.html

延伸阅读
标签: Web开发
方法一:最简单也是用的最多的方法 <%@ page language="java" pageEncoding="GBK" %> 或者<%@ page contenttype="text/html;charset=gbk";>这里可以用gb2312或者gbk,只是gbk比gb2312支持跟多的字符。 这个方法用于jsp页面中的中文显示。 方法二:使用过滤器 过滤器使用主要针对表单提交,插入数据库的数据都...
标签: Web开发
在CSS网页布局中,不可避免的会涉及到CSS伪类的问题。到底该如何正确的定义CSS伪类呢?虽然22333中有很多相关的介绍,但复习一下也无妨。大家看下面的代码就能明白。 a.22333com{text-decoration:none;} a.22333com:link{color:#f90;} a.22333com:hover{color:#fff;background-color:#FF5900;} a.22333com:active{color:#FF5900;} a href="htt...
男人更年期常见三种症状   男性也有更年期,男性更年期综合症是指男子在一定年龄内,骤然发生的各种反常心理状态,并由此产生的各种各样、轻重不同的临床表现。男生更年期多发于50~60岁的男性(男性食品),程度的轻重也很不相同,轻者可没有感觉,重者反应较明显。 人类的衰老和人的性腺功能的关系很密切,虽...
标签: 办公软件
在Excel中,系统将前面带有半角单引号的数字视为文本对待,而且为了某些需要,用户可以通过“格式”菜单中的“单元格”命令,将数字设置为文本格式。然而,现在我们却需要把工作表中文本格式的数字转换成数字,那么以下方法可以一试。 1.一次转换一个单元格 在“工具”菜单上,单击“选项”,再单击“错误检查”选项卡(一定要...
标签: ASP
  众所周知,FileSystemObject组件的强大功能及破坏性是它屡屡被免费主页 提供商(那些支持ASP)的禁用的原因,我整理了一下,本来只找到两种方法,后来 被某人一刺激,硬是想到第三种不为人所知的方法,呵呵,也不知道是不是这样的。 第一种:用RegSrv32 /u C:\WINDOWS\SYSTEM\scrrun.dll(win98路径)来注销该组 件。此方法过于狠毒,...

经验教程

699

收藏

75
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部