c++ wchar_t
·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 #define _T(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这样的宏。
wchar_t解决一些8位表示不完的字符,在使用时wchar_t *p = L"ABC",L就表示是宽字符,windows下的_T,_TEXT都是解决这个问题,用的时候注意一下就行了
最新文章
- Android获取时间2
- fork与vfork
- Hbase之批量删除数据
- FZU 1914 Funny Positive Sequence
- Linux 下的类似Windows下Everything的搜索工具
- 14.4.3 Adaptive Hash Index 自适应hash index
- iptables配置vsftp访问
- 数据处理包dplyr的函数
- 【原创】大叔问题定位分享(6)Dubbo monitor服务iowait高,负载高
- uva 1232
- 整理python小爬虫
- [20170623]利用传输表空间恢复数据库2.txt
- Nginx性能调优
- TZOJ 4712 Double Shortest Paths(最小费用最大流)
- MP实战系列(十一)之封装方法详解(续一)
- Python开发【前端】:Ajax(二)
- LeetCode OJ:ZigZag Conversion(字符串的Z字型转换)
- 解决:夜神模拟器连不上adb的问题
- Flash by sshockwave [树dp]
- 对django rest_framework的个人理解