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
分享到:
相关推荐
/* 你能看得出来,这不是一篇正规的技术文章,所以若你不小心从里边读到了一个爱情故事,可不要奇怪。有很多人用程序来表述爱情,在其中我能看到有Money,有Girl,有一些还涉及到Sex,但是我没有找到Love,我始终相信...
- Unicode编码在Java中用于字符表示,每个字符占用两个字节,可以使用十六进制表示。 2. **算术运算符**: - `(1)` `c = a / b;` 进行除法运算,结果为浮点数,除非其中一个操作数是整型并且结果可以被精确表示为...
2012-06-12 12:52 565,945 VCHOME图形图像编程技术篇.chm 2012-06-12 11:59 34,816 VC__T的用途.doc 2012-06-12 11:45 4,438,581 VC坦克大战带地图编辑器.rar 2012-06-12 13:09 7,108,412 VC数据库编程技术与实例....
2. **icudtl.dat**:这是国际组件for Unicode(ICU)的数据文件,用于处理各种语言的文本格式化、日期/时间、数字和排序。VSCode支持多种语言,所以它依赖于ICU来正确处理全球化的文本。 3. **vk_swiftshader.dll**...
2. **编码和字符集问题**:在.NET框架下,尤其是在处理文本文件时,如果文件内容包含了不可见字符(如换行符、制表符或Unicode零字符),可能会造成文件显示为长度为0,但实际上包含有效信息。 3. **编程错误**:...