C++内码转换的三种方法
我们平时常见的三种中文内码是: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语言位操作大小写转换,C语言实现大小写转换的三种方法
今天心血来潮,总结了下大小写转换的方法,大致有三种. 1.使用C语言提供的函数:toupper(),tolower() 使用这两个函数需要引入头文件:#include 示例代码: #include # ...
- c语言中文如何大小写转换器,C语言实现大小写转换的三种方法
今天心血来潮,总结了下大小写转换的方法,大致有三种. 1.使用C语言提供的函数:toupper(),tolower() 使用这两个函数需要引入头文件:#include 示例代码: #include # ...
- string和wstring之间转换的三种方法
方法1 #include <string> #include <locale> #include <codecvt>//convert string to wstr ...
- Excel常用技巧—数字和文本转换,三种方法任你选!!
Excel图表系列: Excel数据分析常用函数①--查询函数 Excel数据分析常用函数②--统计函数 Excel数据分析常用函数③--字符串函数 Excel数据分析常用函数④--日期函数 Exce ...
- 常见的三种中文内码转换代码
作者:ccrun 更新:2005-10-13 浏览:11660 常见的中文内码一般有GB2312(简体中文),GBK和台湾那边用的BIG5(繁体中文),有时候看一些台湾编程论坛里的资料,都 ...
- Java中将对象转换成String的三种方法
日常开发中经常会有对象转成String类型这种场景,一般有三种方法 1.直接进行类型强转,(String) Object o = "2"; System.out.println(( ...
- WPS如何转换成图片?三种方法帮你实现
WPS如何转换成图片?三种方法帮你轻松实现!在大学中,大家完成老师布置的专业课作业都是通过使用电脑中的WPS制作完成.为了防止自己的作业遭到其他同学的私自窜改或是复制粘贴的抄袭.有的同学就会将自己的作 ...
- Nginx/Openresty日志时间显示到毫秒级的三种方法(不改源码)
Nginx/Openresty日志时间显示到毫秒级的三种方法(不改源码) 方法一 :set (只能在server节点内) 方法二: set_by_lua (只能在server节点内) 方法三: map ...
- PHP开发日志 ━━ php、javascript生成二维码的三种方法
最简单最实例的goolge开源方法 推荐手册:php完全自学手册 1.google开放api 代码如下: $urlToEncode="http://www.helloweba.com&quo ...
最新文章
- Hadoop之 MapReducer工作过程
- httpsrequest java_java 发送http和https请求的实例
- winform绑定多张图片
- 学习 | egg.js 从入门到精通
- 错过血亏!深入学习Redis集群搭建方案及实现原理
- 元数据 数据元 释义
- 微信支付宝刷步数_一劳永逸版(在用)
- 笔记19-字节缓冲流字符流
- 二级渠道分销系统开发适合什么样的产品?
- Android SELinux开发入门指南之如何增加Java Binder Service权限
- 冒泡排序(C语言版)
- 访客模式 无痕模式 区别_访客设计模式示例
- AIO,BIO,NIO详解
- vue 中 mixins 的使用
- 放大镜 讲课_放大镜说课稿
- 软考中项:常考知识点及案例分析要点总结
- linux 能打开exe文件,linux能运行exe文件吗
- 斗地主陪练机器人出牌算法使用说明
- cesium切片底图正常出来但控制台一直报错的方法
- Poco的介绍和入门教学
热门文章
- 矩阵正定 matlab,matlab 错误使用 chol 矩阵必须为正定矩阵
- RxJava过滤操作符 debounce
- xshell基础使用命令
- 硬中断、软中断、中断上半部、中断下半部
- python数据域宽左对齐_Python语言及其运用_第七章_像高手一样玩转数据
- h5打开麦克风权限录音_h5打开麦克风权限录音_原来电脑上自带录音功能,很多人还不知道,真的太实用了......
- jQuery中ajax跨域请求
- Altium Designer 18 原理图编译出现off grid错误处理方法
- 用无线插板控制RC(远程遥控)小车
- 缓解 WPF 应用程序中的空域问题