我们平时常见的三种中文内码是: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语言中文内码,C语言辅导:三种常见的中文内码的转换方法相关推荐

  1. c语言字符类型强制换成内码,C语言实现不同汉字系统的内码转换方法

    摹14●摹 1囊 l9髓 丰 3̂ 齐 弃 靖尔 大 学学 报 J伽rn|l 0fQiq 嘶 劬 q 言实现不 字 |I∈峰 张宏烈 周长支 一 1 / (齐弃暗拳太掌工鼍qb,一r /1 -i l ...

  2. python语言中文社区-扯个淡:用Python实现中文编程

    既然是扯淡,就不要当真.所谓"中文编程"就是用中文写写代码,不管你看着累不累,我写着就得累死- "中文编程"由来已久,不知道你听说过"易语言" ...

  3. c语言中文网_在C语言中使用中文字符

    大部分C语言教材对中文字符的处理讳莫如深,甚至只字不提,导致很多初学者认为C语言只能处理英文,而不支持中文.其实C语言是一门全球化的编程语言,它支持世界上任何一个国家的语言文化,包括中文.日语.韩语等 ...

  4. 用函数求C15的值C语言,南开19春学期(1503、1509、1603、1609、1703)《C语言程序设计》在线作业-1辅导资料.docx...

    南开19春学期(1503.1509.1603.1609.1703)<C语言程序设计>在线作业-1辅导资料.docx 南开19春学期(1503.1509.1603.1609.1703)C语言 ...

  5. ubuntu mysql支持中文_ubuntu (16.04) server 英文原版 添加中文语言支持 消除java 程序、mysql 数据库不能处理中文的错误...

    ubuntu 16.04 对于腾讯云主机要添加源,因为腾讯云主机(CVM)的源库中包很少 文件/etc/apt/sources.list是一个普通可编辑的文本文件,保存了ubuntu软件更新的源服务器 ...

  6. 梯形图 c语言代码生成,PLC梯形图中内嵌C语言编程的实现

    针对现有梯形图语言适合实现逻辑控制而不适合实现复杂算法这一问题,从基于构件技术的梯形图实现原理出发,对构件的属性定义以及编译方法进行了分析,提出了一种PLC梯形图内嵌C语言实现混合编程的方法,并在CA ...

  7. [iOS] 完整源码, Swift语言 - 账号保存工具

    代码地址如下: http://www.demodashi.com/demo/15017.html 1. 需求分析 作为一个开发者,平时肯定在各个平台,网站注册了各种账号:由于太多,很多时候都是注册之后 ...

  8. c语言怎么储存字母,c语言怎么用变量存储中文字符?书本上面没有的秘密

    很多学习者做一开始学习c语言的时候都会有想过处理中文的想法,但找不到方法而放弃,但其实方法十分简单.我们下面进入正题吧. 所有学习C语言的学习者都知道ASCII码,甚至很多初学者都认为C语言所用的就只 ...

  9. 计算机的语言是美式英语,为什么电脑的语言栏一直有两国语言“CH中文(中国)”和“EH英语(美国)”...

    这是输入法指示器. 快捷键ctrl+shift+M,设置属性,取消勾选"隐藏状态栏",确定. 语言栏的问题看下边: 添加中文简体美式键盘,如果没有出现,请看下边: XP 1. 右键 ...

最新文章

  1. 3 ie兼容 vue_前端开发:MVVM框架之Vue势必会取代JQuery吗?
  2. 基带模型下基于高阶累积量的MFSK信号的调制识别(代码和参考文献见CSDN同名资源)
  3. 手机web网页制作的认识(有关meta标签)
  4. [Java]一步一步学 Web
  5. 就地链表反转_数据结构与算法系列之链表操作全集(二)(GO)
  6. spring-AspectJ异常通知
  7. 有没有测试直播源的软件,直播源检测验证管理工具(电脑直播源检测助手)V1.2 最新版...
  8. MySQL-Front设置中文
  9. 美通企业日报 | 沃尔玛8.8购物节销售规模猛增;中通快递市场份额持续扩大
  10. SUPPA 可变剪切分析
  11. 手把手教你搭建小程序
  12. vue轮播组件--不插电手动粘贴版
  13. css3制作广告栏效果的疑问? 1
  14. java学习(类和对象)
  15. cf Gym 101086M ACPC Headquarters : AASTMT (Stairway to Heaven)
  16. 智能对话系统评测标准
  17. JAVA IO与NIO优劣浅析
  18. 新版TOMTOM导航仪破解指南
  19. oracle 取当天,Oracle获取当天,当月,当年的数据
  20. 安卓wifi调试助手(单片机wifi上位机)

热门文章

  1. 闲置iPhone这么用
  2. Python:1017 A除以B
  3. Automatic Scoring of Multiple Semantic Attributes With Multi-Task Feature Leverage: A Study on Pu...
  4. 深度学习使用CNN进行图像分类
  5. 用C语言实现简易的2048小游戏
  6. 程序员每天到底有多累?
  7. 试图在WinPE下用cmd.exe调包sethc.exe/utilman.exe/osk.exe来重置管理员密码,但是无法调出命令行
  8. 葵花宝典(转自:https://blog.csdn.net/binbin594738977/article/details/79429301 )
  9. Minecraft国际版下载
  10. 柔性防水套管A型和B型的区别