`
java-mans
  • 浏览: 11742537 次
文章分类
社区版块
存档分类
最新评论

SDK编程笔记-UNICODE篇

 
阅读更多

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编程笔记_—_计时器篇SDK编程笔记_—_...

    taobao-sdk-java-auto源码

    taobao-sdk-java-auto源码, taobao-sdk-java-auto源码, taobao-sdk-java-auto源码, taobao-sdk-java-auto源码

    taobao-sdk-java-auto.zip

    最新官方淘宝服务端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

    钉钉集成旧版,包含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.jar工具类

    taobao-sdk-java-auto-1.0.jar

    taobao-sdk-java-auto-1.0.jar,

    taobao-sdk-java-auto-source.jar

    taobao-sdk-java-auto_1325096207411-20120111-source.jar

    AS 最新SDK下载。sdk-tools-windows-4333796.zip

    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.3 aliyun-java-sdk-core-3.2.3aliyun-java-sdk-core-3.2.3

    qt-sdk-win-opensource-2010.05.part2.rar

    qt-sdk-win-opensource-2010.05.exe QT很经典的一个版本,包含qtdemo,可以直接看各种demo运行效果,包括qml程序demo, 是初学者比较好的入门版本,不过之后版本在编程语法也有改变,自行斟酌! 上传限制分三部分: ...

    qt-sdk-linux-x86-opensource-2010.05.1

    qt-sdk-linux-x86-opensource-2010.05.1

    aliyun-java-sdk-core-3.2.3.jar

    aliyun-java-sdk-dysmsapi-1.0.0.ja jar aliyun sdk java core

    android-4.1SDK android-sdk_r20-windows.zip

    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-java-sdk-8.0-5.11-x86_64-archive.bin ibm的jdk 8.0版本

    aliyun-sdk-oss-3.10.2.jar

    aliyun-sdk-oss-3.10.2.jar,免费下载

    eclipse-SDK-3.4.1-win32

    通过安装各种插件,可以支持不同的编程语言、框架和工具,如Mylyn(任务管理)、PDE(插件开发环境)等。 5. **版本控制**:与Git、SVN等版本控制系统集成,方便代码版本管理和协同开发。 6. **构建工具**:Maven和...

    包含alipay-sdk-java-1.0.0.jar,alipay-trade-sdk-1.0.0.jar

    在这个特定的压缩包中,我们有两个重要的Java库文件:`alipay-sdk-java-1.0.0.jar` 和 `alipay-trade-sdk-1.0.0.jar`。这两个文件包含了支付宝交易接口的相关功能,允许开发者与支付宝服务器进行通信,实现支付、...

Global site tag (gtag.js) - Google Analytics