Programming Windows (二)_ UNICODE

 

ASCII

美国人发明了计算机,开始的编码方式采用 ASCII 7-bits ASCII 的传统字符并不满足实际使用,因此在基于 ASCII 的基础上扩展成了 8 位的 Extending ASCII 。扩展部分用于表示拉末字符等,不同系统的扩展字符被放到不同的 Code page 上,扩展的 ASCII 并不统一。在 MS-DOS 的时代,在一个计算机上设置好 Code Page 后编辑文件,再打印出来,没有问题,但是,如果一个用户需要将文档保存下来,另一个用户在使用不同 Code Page 的情况下编辑该文档,转换工作是必不可少的

 

 

DBCS Double Byte Character Sets

光使用 ASCII 就无法表示所有的欧洲国家的字符,更别说中文,韩文,日文。 DBCS 是这样定义的: ASCII 仍然使用前 128 个字符表示,即 ASCII 仍然用一个字节表示,大于 128 的其它字符都使用两个字节表示。

DBCS 在实际应用中会出现比较怪的问题:有的字符长度为 1 ,有的字符长度为 2 ,这样一个字符串的长度不能再用来表示字符个数了。再如,已知一个指向 DBCS 字符串中间的指针,如何得到前一个字符的地址?这估计得从字符串开始遍历了吧

 

UNICODE

         no matter what the platform,
         no matter what the program,
         no matter what the language
.

Unicode 很好地解决了上述问题, Unicode 规定,不管是前 128 ASCII 还是后面的什么字符,统一两个字节表示,如字符 'A' Unicode 表示为 0x0041( Intel 架构中存储为 0x41 0x00) ,这样无论什么字符都能统一、唯一地使用两个字节来表示

 

Unicode 编程

 

#include <windows.h>

#include <iostream>

 

using namespace std;

 

int main()

{

char szArray[] = "Hello world";

cout << sizeof(szArray) << endl;

cout << strlen(szArray) << endl;

 

wchar_t wtArray[] = L"Hello wrold";

cout << sizeof(wtArray) << endl;

cout << wcslen(wtArray) << endl;

 

return 0;

}

 

输出结果:

12

11

24

11

 

如果所有的软件都使用 UNICODE ,那生产的可执行文件肯定会更大,为避免浪费资源,可能需要提供两个版本的代码,一个用于生成 ASCII ,一个用于生成 UNICODE 格式

 

同一个软件需要维护两个版本的代码是很头痛的事,好在库函数中已经使用宏定义的方式为我们提供了两个接口

 

//#define UNICODE

 

#include <windows.h>

#include <iostream>

 

 

using namespace std;

 

int main()

{

char szArray[] = "Hello world";

cout << sizeof(szArray) << endl;

cout << strlen(szArray) << endl;

 

TCHAR wtArray[] =TEXT("Hello World");

cout << sizeof(wtArray) << endl;

cout << lstrlen(wtArray) << endl;

 

return 0;

}

           UNICODE 宏关闭时的输出结果:

12

11

12

11

 

UNICODE 宏打开时的输出结果:

12

11

24

11

 

同样 Windows API 也为我们提供了两个版本号的接口

 

如: MessageBox(...)

 

WINUSERAPI int WINAPI MessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);

WINUSERAPI int WINAPI MessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType);

 

#ifdef UNICODE

#define MessageBox MessageBoxW

#else

#deifne MessageBox MessageBoxA

#endif

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值