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

使用C++进行Unicode 编程

2013-01-17 14:01 232 查看
使用C++进行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”字符

串为例,在宽字符下,它的五个字符是:

0x0048 0x0065 0x006c 0x006c 0x006f

在内存中,实际的排列是:

48 00 65 00 6c 00 6c 00 6f 00

于是,ANSI 字符串函数,如strlen,在碰到第一个48 后的00 时,就会认为字符

串到尾了,用strlen 对宽字符串求长度的结果就永远会是1!

4、用宏实现对ANSI 和Unicode 通用的编程

可见,C++有一整套的数据类型和函数实现Unicode 编程,也就是说,您完全可

以使用C++实现Unicode 编程。

如 果 我们想要我们的程序有两个版本:ANSI 版本和Unicode 版本。当然,编写两套

代码分别实现ANSI 版本和Unicode 版本完全是行得通的。但是,针对ANSI 字符和

Unicode 字符维护两套代码是非常麻烦的事情。为了减轻编程的负担,C++定义了

一系列的宏,帮助您实现对ANSI 和Unicode 的通用编程。

C++宏实现ANSI 和Unicode 的通用编程的本质是根据”_UNICODE”(注意,有下

划线)定义与否,这些宏展开为ANSI 或Unicode 字符(字符串)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: