概述
使用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 字符(字符串)。
最后
以上就是友好书本为你收集整理的使用C++进行Unicode 编程的全部内容,希望文章能够帮你解决使用C++进行Unicode 编程所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复