分享
 
 
 

SDK编程笔记-UNICODE篇

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

SDK编程笔记-UNICODE篇

[简单基础但重要]

Petzold的Programming Windows的第2章非常详细的讲解了关于Unicode的方方面面。我们需要知道的是它给C语言和Windows编程带来的变化。

·C语言相关

对应于char, C语言中也有宽字符内型wchar_t。wchar_t被定义为: typedef unsigned short wchar_t ;显然它是16位的。wchar_t类型的常字串应该这样写: L"hello" 。因此可以这样定义一个宽字符指针 wchar_t *pwc=L"hello";。

对于字符串函数, C语言中也有两个版本。如对应于strlen有wcslen,wprintf是printf的宽字符版。当然这两个版本的函数使用各自类型的参数,原因是显然的,char和unsigned short 怎么能等同呢?编译器是不会放过你的。

下表是对char,wchar_t相关内容的比较:

(测试环境:VC++6.0)

char类型

wchar_t类型

类型大小(32位系统)

8位

16位

常量字符表示法

'A'

L'A' 或 'A'

常量字符串表示法

'hello'

L'hello'

一些使用方法

char c='A'; (c的值:0x41)

wchar_t wc='A'; (wc的值:0x0041)

char* p='hello';

wchar_t* pw=L"hello";

sizeof

sizeof("hello")=6

sizeof(L"hello")=12

计算长度

strlen("hello")=5

wcslen(L"hello)=5

既然有两个版本的函数,如果我们想在程序中同时支持它们该怎么办?如果使用VC++,你只要在程序中包含tchar.h头文件,这个文件中提供了一些宏以兼容两种字符集。例如:

#ifdef _UNICODE

typedef wchar_t _TCHAR;

typedef wchar_t TCHAR;

#define __T(x) L ## x

#define _tprintf wprintf

#define _tcslen wcslen

......

#else

typedef char _TCHAR;

typedef char TCHAR;

#define __T(x) x

#define _tprintf printf

#define _tcslen strlen

......

#endif

#define _T(x) __T(x)

#define _TEXT(x) __T(x)

我们只要使用TCHAR,_tpirntf,_tcslen,_TEXT等,就可以兼顾两种字符集。

·Windows相关

Windows2000/NT完全支持Unicode,Windows98对Unicode支持很少。我们关心的是怎样编写程序,既可以编译为不支持Unicode,又可编译为支持Unicode。Windows SDK的头文件中定义了一些宏以完成这个任务。

typedef char CHAR ;

typedef wchar_t WCHAR ; // wc

typedef CHAR * PCHAR, * LPCH, * PCH, * NPSTR, * LPSTR, * PSTR ;

typedef CONST CHAR * LPCCH, * PCCH, * LPCSTR, * PCSTR ;

typedef WCHAR * PWCHAR, * LPWCH, * PWCH, * NWPSTR, * LPWSTR, * PWSTR ;

typedef CONST WCHAR * LPCWCH, * PCWCH, * LPCWSTR, * PCWSTR ;

和标准C一样,windows C也使用TCHAR作为兼容的类型

#ifdef UNICODE

typedef WCHAR TCHAR, * PTCHAR ;

typedef LPWSTR LPTCH, PTCH, PTSTR, LPTSTR ;

typedef LPCWSTR LPCTSTR ;

#define __TEXT(quote) L##quote

#else

typedef char TCHAR, * PTCHAR ;

typedef LPSTR LPTCH, PTCH, PTSTR, LPTSTR ;

typedef LPCSTR LPCTSTR ;

#define __TEXT(quote) quote

#endif

另外还有一个TEXT宏,等价于__TEXT宏:#define TEXT(quote) __TEXT(quote)。

写Win32 SDK程序的时候常常在注册窗口类时使用如下代码:

if (!RegisterClass (&wndclass)) {

MessageBox ( NULL, TEXT ("This program requires Winodws 2000/NT"), szAppName, MB_ICONERROR) ;

return 0 ;

}

这样,当在Windows98下运行使用了Unicode的程序时,程序可以给出提示并退出。这段代码为什么在Win98下可以运行?因为MessageBox在存在Unicode的定义下,被替换为MessageBoxW,而MessageBoxW是Win98支持的少数宽字符Windows函数之一。

总之,写Windows SDK程序时尽可能使用像TCHAR,PTSTR,LPCTSTR,TEXT这样的宏。

the end

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有