TCHAR char wchar_t PTSTR PCSTR printf() wprintf()——_tprintf()解析
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 #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这样的宏。
TCHAR char wchar_t PTSTR PCSTR printf() wprintf()——_tprintf()解析相关推荐
- TCHAR char wchar_t 的区别
有的人爱用strcpy等标准ANSI函数,有的人爱用_tXXXX函数,有必要把来龙去脉搞清楚. 为了搞清这些函数,就必须理请几种字符类型的写法.char就不用说了,先说一些wchar_t.wchar_ ...
- VC++中的char,wchar_t,TCHAR(转载)
VC++中的char,wchar_t,TCHAR 大家一起做一个项目,经常发现有的人爱用strcpy等标准ANSI函数,有的人爱用_tXXXX函数,这个问题曾经搞的很混乱.为了统一,有必要把来龙去脉搞 ...
- 关于char, wchar_t, TCHAR, _T,L,TEXT,_TEXT,LPSTR,LPCSTR,PWSTR,PCWSTR,LPTSTR,LPCTSTR的区别
#ifdef UNICODE typedef wchar_t TCHAR; #else typedef unsigned char TCHAR; #endif typedef unsigned cha ...
- TCHAR char
因为C++支持两种字符串,即常规的ANSI编码(使用""包裹)和Unicode编码(使用L""包裹),这样对应的就有了两套字符串处理函数,比如:strlen和w ...
- String,CString,TCHAR*,char*之间区别和联系
最近老用到Cstring, TCHAR*, char*的转换. 找到一篇写得蛮详细的. 引用过来, 方便自己以后查阅. char是类型TCHAR也是!不过他可以通过是否定义了UNICODE宏来判断到底 ...
- char*,wchar_t*,CString和BSTR之间的转换
前言 本文并不尝试列举出所有的转换方法,只列举作者认为方便易用的方法. 1.char*和wchar_t*的相互转换 可以利用中间类_bstr_t(头文件comdef.h)方便的进行相互转换 const ...
- 关于char, wchar_t, TCHAR, _T(),L,宏 _T、TEXT,_TEXT
char :单字节变量类型,最多表示256个字符, wchar_t :宽字节变量类型,用于表示Unicode字符, 它实际定义在<string.h>里:typedef unsigned s ...
- char wchar_t TCHAR
1.char 是8位字符类型,可以储存不超过256个字符.---多字节(储存英文字符时为1个字节,储存中文字符时为两个字节)ascii 2.wchar_t 是16位或者32位字符类型,跟选择不同的C或 ...
- Unichar, char, wchar_t
之前总结了一些关于字符表示,以及字符串的知识. 现在在看看一些关于编译器支持的知识. L"" Prefix 几乎所有的编译器都支持L"" prefix,一个字符 ...
最新文章
- 《淘宝网开店 拍摄 修图 设计 装修 实战150招》一一1.17 如何选择合适的拍摄地点...
- 基于Apache(without ssl)的svn环境搭建
- 《深入实践Spring Boot》下载
- java out.flush_java中基本输入输出流的解释(flush方法的使用)
- ECCV 2020 论文大盘点-姿态估计与动作捕捉篇
- 消息中间件学习总结(4)——RocketMQ之RocketMQ 迈入50万TPS消息俱乐部
- 还在担心快应用没流量?全场景新玩法来袭!
- Netty 启动过程源码分析 (本文超长慎读)(基于4.1.23)
- URTracker 试用不过期修改方法
- 人狠话不多,细说大牛直播SDK之RTMP播放器和RTSP播放器...
- GEE实现夜光遥感数据分析
- java 去除图片背景_java如何去除图片中的白色背景
- 微信小程序之人脸识别
- 万网空间 php伪静态,百度云虚拟主机zblogphp在Nginx环境下设置伪静态规则,极为重要...
- Cython基础--Cython的函数
- 基于神经网络的系统辨识,神经网络与图像识别
- 治愈系插画PSD源文件+笔刷分享
- MES系统供应商评估报告-- Gartner出品
- Jedis的使用示范
- Java练习-002