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
分享到:
相关推荐
alipay-sdk-java-allalipay-sdk-java-allalipay-sdk-java-allalipay-sdk-java-allalipay-sdk-java-allalipay-sdk-java-allalipay-sdk-java-allalipay-sdk-java-allalipay-sdk-java-allalipay-sdk-java-allalipay-sdk...
SDK编程笔记_—_计时器篇SDK编程笔记_—_计时器篇SDK编程笔记_—_计时器篇SDK编程笔记_—_计时器篇SDK编程笔记_—_计时器篇SDK编程笔记_—_计时器篇SDK编程笔记_—_计时器篇SDK编程笔记_—_计时器篇SDK编程笔记_—_...
taobao-sdk-java-auto源码, taobao-sdk-java-auto源码, taobao-sdk-java-auto源码, taobao-sdk-java-auto源码
最新官方淘宝服务端SDK,5月18日更新,包含taobao-sdk-java.jar和taobao-sdk-java-source.jar两个文件,供大家下载研究。 maven安装命令:mvn install:install-file -Dfile=路径\xxx.jar -DgroupId=dingtalk-sdk-...
eclipse-SDK-3.4.1-win32 eclipse-SDK-3.4.1-win32 eclipse-SDK-3.4.1-win32
taobao-sdk-java-auto.jar工具类,taobao-sdk-java-auto.jar工具类
钉钉集成旧版,包含taobao-sdk-java-auto_1479188381469-20220428.jar、taobao-sdk-java-auto_1479188381469-20220428-source.jar
从谷歌官方下载的,2018.5.9日最新版sdk-tools-windows-4333796.zip
taobao-sdk-java-auto_1325096207411-20120111-source.jar
taobao-sdk-java-auto-1.0.jar,
taobao-sdk-java-auto-1479188381469-20180227.jar 淘宝开放平台api sdk java 版本 taobao-sdk-java-auto-*.jar
qt-sdk-win-opensource-2010.04
Altium-SDK---Technical-Reference---System-API,Altium开发接口文档
赠送jar包:aws-java-sdk-s3-1.11.939.jar 赠送原API文档:aws-java-sdk-s3-1.11.939-javadoc.jar 赠送源代码:aws-java-sdk-s3-1.11.939-sources.jar 包含翻译后的API文档:aws-java-sdk-s3-1.11.939-javadoc-...
qt-sdk-linux-x86-opensource-2010.05.1
alipay sdk trade-sdk 支付宝接口sdk,包含alipay-sdk-java-1.0.0.jar,alipay-trade-sdk-1.0.0.jar
android 4.1 最新SDK Windows版: http://s1.eoeandroid.com/sdk/4.1/android-sdk_r20-windows.zip(推荐) http://s1.eoeandroid.com/sdk/4.1/installer_r20-windows.exe Mac版: ...