文档章节

字符编码的使用和转换

rise-worlds
 rise-worlds
发布于 2016/06/20 13:40
字数 759
阅读 4
收藏 0
字符编码的使用

字符编码主要分两种:MBCS以及 Unicode。 以 C/CC++ 为例,以 char 为单位的数组使用MBCS编码(如 ASCII,GB2312,BIG5),以wchar_t 为单位的数组使用Unicode作为编码。

比如你的程序中使用:
char szTitle[] = "窗体标题“;
此时,szTitle字符串使用的的是MBCS编码,如果用户的操作系统不是中文的Windows,你的程序将无法正常显示!

所以,要换成Unicode方式:
wchar_t szTitle[] = L"窗体标题";
此时,szTitle字符串使用的的是Unicode编码,加入你的程序以unicode方式编译,在任何语言的Windows上都能显示正常。


字符编码的转换

有时候你从外部文件读进来的字符串是MBCS编码(如GB2312),而你程序里面都是统一用Unicode处理字符串,这时候要进行字符编码转换。 Windows为我们提供了很好用的API函数 MultiByteToWideChar WideCharToMultiByte 帮我们轻松实现转换。     代码如下:

GB2312 转换成 Unicode:

CODE:
wchar_t* GB2312ToUnicode(const char* szGBString)
{
           UINT nCodePage = 936; //GB2312
           int nLength=MultiByteToWideChar(nCodePage,0,szGBString,-1,NULL,0);
           wchar_t* pBuffer = new wchar_t[nLength+1];
           MultiByteToWideChar(nCodePage,0,szGBString,-1,pBuffer,nLength);
           pBuffer[nLength]=0;
           return pBuffer;
}
BIG5 转换成 Unicode:

CODE:
wchar_t* BIG5ToUnicode(const char* szBIG5String)
{
           UINT nCodePage = 950; //BIG5
           int nLength=MultiByteToWideChar(nCodePage,0,szBIG5String,-1,NULL,0);
           wchar_t* pBuffer = new wchar_t[nLength+1];
           MultiByteToWideChar(nCodePage,0,szBIG5String,-1,pBuffer,nLength);
           pBuffer[nLength]=0;
           return pBuffer;
}
Unicode 转换成 GB2312:

CODE:
char* UnicodeToGB2312(const wchar_t* szUnicodeString)
{
           UINT nCodePage = 936; //GB2312
           int nLength=WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,NULL,0,NULL,NULL);
           char* pBuffer=new char[nLength+1];
           WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,pBuffer,nLength,NULL,NULL);
           pBuffer[nLength]=0;
           return pBuffer;
}
Unicode 转换成 BIG5:

CODE:
char* UnicodeToBIG5(const wchar_t* szUnicodeString)
{
           UINT nCodePage = 950; //BIG5
           int nLength=WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,NULL,0,NULL,NULL);
           char* pBuffer=new char[nLength+1];
           WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,pBuffer,nLength,NULL,NULL);
           pBuffer[nLength]=0;
           return pBuffer;
}
繁体和简体的相互转换

利用Unicode作为媒介,还可以做出很有意思的应用。在处理中文过程中,一个经常用到的功能就是繁体和简体的互相转换。 代码如下:

繁体中文BIG5 转换成 简体中文 GB2312

CODE:
char* BIG5ToGB2312(const char* szBIG5String)
{
           LCID lcid = MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC);

           wchar_t* szUnicodeBuff = BIG5ToUnicode(szBIG5String);
           char* szGB2312Buff = UnicodeToGB2312(szUnicodeBuff);

           int nLength = LCMapString(lcid,LCMAP_SIMPLIFIED_CHINESE, szGB2312Buff,-1,NULL,0);
           char* pBuffer = new char[nLength + 1];
           LCMapString(0x0804,LCMAP_SIMPLIFIED_CHINESE,szGB2312Buff,-1,pBuffer,nLength);
           pBuffer[nLength] = 0;
       
           delete[] szUnicodeBuff;
           delete[] szGB2312Buff;
           return pBuffer;
}
简体中文 GB2312 转换成 繁体中文BIG5

CODE:
char* GB2312ToBIG5(const char* szGBString)
{
           LCID lcid = MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC);

           int nLength = LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGBString,-1,NULL,0);
           char* pBuffer=new char[nLength+1];
           LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGBString,-1,pBuffer,nLength);
           pBuffer[nLength]=0;

           wchar_t* pUnicodeBuff = GB2312ToUnicode(pBuffer);
           char* pBIG5Buff = UnicodeToBIG5(pUnicodeBuff);

           delete[] pBuffer;
           delete[] pUnicodeBuff;
           return pBIG5Buff;
}

文本文件读写的编码问题

当你的程序读一个文本文件时,如何判断文件中的字符是MBCS格式还是Unicode格式? Windows定义了一个"字节顺序标记"(Byte-order Mark)的概念:当一个txt文件的前2个字节为FF FE时,这个文件里面的字符采用Unicode编码, 如果没有字节顺序标记,就是MBCS编码。更多关于字节顺序标记的说明,请看 MSDN的官方资料

本文转载自:http://www.cnblogs.com/flying_bat/archive/2007/10/30/942647.html

rise-worlds

rise-worlds

粉丝 3
博文 1755
码字总数 0
作品 0
深圳
程序员
私信 提问
使用URLDecoder和URLEncoder对中文进行处理

一 URLEncoder HTML 格式编码的实用工具类。该类包含了将 String 转换为 application/x-www-form-urlencoded MIME 格式的静态方法。有关 HTML 格式编码的更多信息,请参阅 HTML 规范。 对 St...

墨梅
2014/10/29
101
0
Linux 文件编码大挪移

你可能已经知道,计算机除了二进制数据,是不会理解和存储字符、数字或者任何人类能够理解的东西的。一个二进制位只有两种可能的值,也就是0或1,真或假,是或否。其它的任何事物,比如字符、...

linux小陶
2016/12/08
11
0
关于 Java IO(二):从面向字节到面向字符

在上一篇文章中,我们以面向字节的输入为例,介绍了 Java 中 IO 的结构。在这篇文章中,主要介绍面向字节的输入输出是怎么转换到面向字符的输入输出的。 面向字符的输入输出指的是输入输出的...

Happioo
2018/04/09
0
0
Java中的字符集编码入门(五)

如果你是JVM的设计者,让你来决定JVM中所有字符的表示形式,你会不会允许使用各种编码方式的字符并存? 我想你的答案是不会,如果在内存中的Java字符可以以GB2312,UTF-16,BIG5等各种编码形...

Java开发者
2010/05/05
165
0
字符转换器ASCII码转换大小写转换进制转换 V3.0绿色中文版

名称:字符转换器ASCII码转换大小写转换进制转换V3.0绿色中文版版本:3.0软件大小:223.77 KB软件语言:简体中文软件授权:共享版应用平台:Vista/winXP/win7/win8该字符转换器可以进行ASCII...

相心的泪
2016/07/22
14
0

没有更多内容

加载失败,请刷新页面

加载更多

MySQL左连接问题,右表做筛选,左表列依然在

两张表,一张user表,一张user_log表 CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFA......

bengozhong
27分钟前
5
0
重新开始学Java——多线程基础

多线程 进程 主流计算机操作系统都支持同时运行多个任务 , 每个任务通常就是一个程序 , 每个运行中的程序就是一个进程或者多个进程 。 进程的特点 独立性 进程是系统中独立存在的实体 可以...

大家都是低调来的
28分钟前
7
0
注解在Java中是如何工作的?

> 来一点咖啡,准备好进入注解的世界。 注解一直是 Java 的一个非常重要的部分,它从 J2SE 5.0 开始就已经存在了。在我们的应用程序代码中,经常看到 @Override 和 @Deprecated 这样的注解。...

liululee
30分钟前
18
0
Docker 容器连接

Docker 容器连接 容器间的链接有两种方法,你选择其一即可 网络端口映射 docker run -d -P docker run -d -p-P :是容器内部端口随机映射到主机的高端口。-p : 是容器内部端口绑定到指定...

测者陈磊
33分钟前
9
0
车载导航应用中基于Sketch UI主题定制方案的实现

1.导读 关于应用的主题定制,相信大家或多或少都有接触,基本上,实现思路可以分为两类: 内置主题(应用内自定义style) 外部加载方式(资源apk形式、压缩资源、插件等) 其实,针对不同的主题...

阿里云官方博客
39分钟前
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部