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
分享到:
相关推荐
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-...
钉钉集成旧版,包含taobao-sdk-java-auto_1479188381469-20220428.jar、taobao-sdk-java-auto_1479188381469-20220428-source.jar
taobao-sdk-java-auto.jar工具类,taobao-sdk-java-auto.jar工具类
taobao-sdk-java-auto-1.0.jar,
taobao-sdk-java-auto_1325096207411-20120111-source.jar
sdk-tools-windows-4333796.zip"指的是Android Studio的SDK工具包的最新版本,适用于Windows操作系统。这个版本号“4333796”代表着该SDK工具在2018年5月9日时的更新迭代,表明这是当时谷歌官方提供的最新稳定版本。...
aliyun-java-sdk-core-3.2.3 aliyun-java-sdk-core-3.2.3aliyun-java-sdk-core-3.2.3
qt-sdk-win-opensource-2010.05.exe QT很经典的一个版本,包含qtdemo,可以直接看各种demo运行效果,包括qml程序demo, 是初学者比较好的入门版本,不过之后版本在编程语法也有改变,自行斟酌! 上传限制分三部分: ...
qt-sdk-linux-x86-opensource-2010.05.1
aliyun-java-sdk-dysmsapi-1.0.0.ja jar aliyun sdk java core
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版: ...
ibm-java-sdk-8.0-5.11-x86_64-archive.bin ibm的jdk 8.0版本
aliyun-sdk-oss-3.10.2.jar,免费下载
通过安装各种插件,可以支持不同的编程语言、框架和工具,如Mylyn(任务管理)、PDE(插件开发环境)等。 5. **版本控制**:与Git、SVN等版本控制系统集成,方便代码版本管理和协同开发。 6. **构建工具**:Maven和...
在这个特定的压缩包中,我们有两个重要的Java库文件:`alipay-sdk-java-1.0.0.jar` 和 `alipay-trade-sdk-1.0.0.jar`。这两个文件包含了支付宝交易接口的相关功能,允许开发者与支付宝服务器进行通信,实现支付、...