您的位置:首页 > 编程语言

windows编程学习笔记(7)ASCII与Unicode编码问题

2014-11-14 21:24 381 查看
以前本人写代码一直用的是VC6.0,最近才开始用VS2012写代码,VS默认的是使用Unicode字符集,在Unicode上出了很多问题,本来想着糊弄糊弄就过去了,但是一想,如果就这么过去了,那我也许永远也不懂,还是写出来加深一下印象。这篇文章主要是讲Unicode和ASCII编码的问题,以及在VS2012上使用Unicode需要注意的问题。

一.ASCII编码

ASCII(American Standard Code for Information)编码,中文名字美国信息交换标准代码。这是最早的计算机非数值编码方案,在当时,计算机上主流的语言就是拉丁语(没办法,谁让人家老美发明的计算机呢?我们每天写英文代码写得很蛋疼,要是写中文代码就爽了,哈哈,不过如果是中文表示的代码,估计除了中国的程序员都疯了),所以当时的人们想,只要能够囊括那些字母就可以表示所有的东西,如果当时就采用Unicode编码,那我们今天就会省去很多麻烦(话说回来,科技是不断进步的,人的认识也是不断进步的,没有任何的技术是完美的,都需要顺应时代的变化而做出变化)
ASCII编码为7个二进制位,可以表示128个字符,用一个字节表示,最高位作为校验位,低7位表示ASCII码。包括10个十进制数字,52个英文大写,小写字母,34个专用符号,32个控制符号。除了标准的ASCII码外,一些公司还使用8位的ASCII编码,即一个字节表示的编码,可以表示256个字符,英文是肯定够了,但是我们博大精深的中文呢?好像我们一口气就能说完256个字!ASCII编码肯定是不够用的,于是乎,就有了下一种编码,ANSI标准码。

二.ANSI标准编码

ANSI(American National Standards Institute)美国国家标准协会,(等等,为什么是美国?不是说中国的字嘛!)没错,就是美国,这不是一个编码方案,这只是一个组织,各个国家根据各国文字的特点进行编码,经过该组织的认证即可,这个组织的标准就是ASCII码的位置不能被占用,其他的自便。中国的大陆地区采用GB码,台湾地区采用BIG5码,GB码采用两个字节表示,每个字节采用低7位编码,这样最多可以表示出16384个汉字,显然足够我们使用了。但是这种编码也存在缺陷,虽然各国的编码都叫ANSI标准的编码,可各国的不同,试想一下,如果同时想用中国的和韩国的字,该怎么办呢?显然,这也不是一个妥当的编码方案,于是就有了Unicode编码方案。

三.Unicode编码

Unicode编码,顾名思义,统一编码,就是一张编码表中涵盖了所有的文字,管你是中文韩文西班牙文,都能在表中找到,这样就解决了ANSI标准编码的冲突问题。Unicode编码方式与国际标准ISO/IEC 10646的通用字符集(Universal
Character Set,UCS)相对应,两者码表兼容。关于UCS,有UCS-2编码,即用两个字节表示字符;有UCS-4编码,即用四个字节表示字符,当然还有之前就存在的ASCII编码,即一个字节即表示ASCII编码。
Unicode编码虽然是固定的,但是不同平台有不同的实现方式,一般都会处于节省空间的考虑,不会采用固定的四字节编码,而两字节又不能表示全世界所有的字符,所以一般会采用变长的方式实现Unicode。Unicode实现的方式称为Unicode
Translation Format,UTF目前存在的UTF格式有UTF-7,UTF-7.5,UTF-8,UTF-16,UTF-32。
以UTF-8为例,UTF-8是变长编码,最低用一个字节,最高用六个字节。即ASCII码仍用一个字节表示,而其他的视情况而定。

其实编码方式应该算是“历史遗留问题”,今后肯定还是都朝着Unicode的方向发展,虽然用惯了原来的编码方式,但是为了和国际接轨,还是开始用Unicode吧,不然以后改代码会改到崩溃。。。



四.VS中Unicode的使用

最近用VS2012编程,想运行一下之前在VC6.0下运行的程序,打开一个程序,一编译,原来在VC6.0下好好的程序,一下子蹦出了十来个错误,本人当时就崩溃了。仔细看了一下,其实都是字符集惹的祸。VS2012默认支持的字符集是Unicode字符集,而VC6.0默认的字符集是多字节字符集。

这种错误一般都是报出诸如“const char* 不能转换成为XXX”的问题
如:
error C2440: “=”: 无法从“const char [7]”转换为“LPCWSTR”与指向的类型无关;转换要求 reinterpret_cast、C 样式转换或函数样式转换

下面说一下解决方案:
方案一:这是个治标不治本的方法,明知道应该使用Unicode字符集,但我偏偏还要使用多字节字符集,就是原来VC6.0使用的字符集。
原因也很简单,毕竟是以前的东西,有些确实懒得再去修改了。所以为了能够运行,索性就把字符集换成多字节字符集。

具体方法如下:
从VS2012的工具栏选择 项目-->属性,打开属性控制面板。 选择 配置属性-->常规-->字符集。 可以选择使用Unicode字符集或者多字节字符集。


方案二:这个就是直接在编程的时候使用Unicode字符集,虽然会麻烦一些,但是我们毕竟还是要使用Unicode字符集,不能因为它麻烦我们就不用了。
目前的C++语法支持两种字符串形式:
一种是char*或者const char* 如“HELLO”;
另一种是w_char_t*或者const w_char_t* 如L"HELLO"注意第二种在双引号前面加了一个L。

TCHAR对应char
LPTSTR对应char*
LPCTSTR对应const char*

在VS中编程,我们可以这样处理,使用L开头的字符串,但是也是有一定的局限性,万一我不适用Unicode字符集了,哪天又想回到VC上编译一下,那我不是更崩溃了吗?

所以这里面我们使用另一种更加人性化的方式,即_T宏。
_T宏的作用很简单,如果当前使用的工程设置的是Unicode字符集,那它会自动在前面加一个L,如果没有设置Unicode字符集,就不加。即,如果是Unicode字符集,_T("HELLO")就自动转化为L"HELLO",否则还是为“HELLO”。
补充:如果在编译的时候,提示没有找到_T符号,那就加上atlstr.h头文件。
还有一种方法,就是使用CString字符串,CString字符串有能够识别Unicode的构造函数,赋值运算符以及比较运算符。直接使用CString字符串也可以省去我们不少的麻烦。





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: