一、什么是Unicode 先从ASCII说起,ASCII是用来表示英文字符的一种编码规范。每个ASCII字符占用1个字节,因此,ASCII编码可以表示的最大字符数是 255(00H—FFH)。其实,英文字符并没有那么多,一般只用前128个(00H—7FH,最高位为0),其中包括了控制字符、数字、大小写字母和其它一些符号。而最高位为1的另128个字符(80H—FFH)被称为“扩展ASCII”,一般用来存放英文的制表符、部分音标字符等等的一些其它符号。 于是,Unicode诞生了。 Unicode也是一种字符编码方法,它占用两个字节(0000H—FFFFH),容纳65536个字符,这完全可以容纳全世界所有语言文字的编码。 二、使用Unicode编码的好处 使用Unicode编码可以使您的工程同时支持多种语言,使您的工程国际化。
对宽字符的支持其实是ANSI C标准的一部分,用以支持多字节表示一个字符。宽字符和Unicode并不完全等同,Unicode只是宽字符的一种编码方式。 1、宽字符的定义 在ANSI中,一个字符(char)的长度为一个字节(Byte)。使用Unicode时,一个字符占据一个字,C++在wchar.h头文件中定义了最基本的宽字符类型wchar_t: typedef unsigned short wchar_t; 从这里我们可以清楚地看到,所谓的宽字符就是无符号短整数。 2、常量宽字符串 对C++程序员而言,构造字符串常量是一项经常性的工作。那么,如何构造宽字符字符串常量呢?很简单,只要在字符串常量前加上一个大写的L就可以了,比如: wchar_t *str1=L" Hello"; 这个L非常重要,只有带上它,编译器才知道你要将字符串存成一个字符一个字。还要注意,在L和字符串之间不能有空格。 3、宽字符串库函数 为了操作宽字符串,C++专门定义了一套函数,比如求宽字符串长度的函数是 size_t __cdel wchlen(const wchar_t*); 为什么要专门定义这些函数呢?最根本的原因是,ANSI下的字符串都是以’/
0
’
来标识字符串尾的(Unicode字符串以“/0/
0
”
结束),许多 字符串函数的正确操作均是以此为基础进行。而我们知道,在宽字符的情况下,一个字符在内存中要占据一个字的空间,这就会使操作ANSI字符的字符串函数无 法正确操作。以”Hello”字符串为例,在宽字符下,它的五个字符是: 48 00 65 00 6c 00 6c 00 6f 00 于是,ANSI字符串函数,如strlen,在碰到第一个48后的00时,就会认为字符串到尾了,用strlen对宽字符串求长度的结果就永远会是1! 4、用宏实现对ANSI和Unicode通用的编程 可见,C++有一整套的数据类型和函数实现Unicode编程,也就是说,您完全可以使用C++实现Unicode编程。 如下是tchar.h头文件中部分代码摘抄: #ifdef _UNICODE typedef wchar_t TCHAR; #define __T(x) L##x #define _T(x) __T(x) #else #define __T(x) x typedef char TCHAR; #endif 可见,这些宏根据”_UNICODE” 定义与否,分别展开为ANSI或Unicode字符。 tchar.h头文件中定义的宏可以分为两类: A、实现字符和常量字符串定义的宏 我们只列出两个最常用的宏:
注意: B、实现字符串函数调用的宏 C++为字符串函数也定义了一系列宏,同样,我们只例举几个常用的宏:
|
VC++的Unicode编程(一)
最新推荐文章于 2023-07-11 16:49:56 发布
VC++的Unicode编程(一)
2007年11月24日 星期六 12:54 P.M.