char,wchar_t引出的讨论

关于char,wchar_t以及相关函数,一直很纠结。  直到看到了这篇文章:

C++的字符分成两种类型wchar_t和char。   
其中   WCHAR==wchar_t,CHAR==char。   
TCHAR是一种条件编译的类型,根据条件可以代表wchar_t或char。

#ifdef   UNICODE     
          typedef   wchar_t   TCHAR;     
#else     
          typedef   unsigned   char   TCHAR;     
#endif    


typedef   unsigned   char   CHAR;     
typedef   unsigned   wchar_t   WCHAR;

CHAR为单字节字符。还有个WCHAR为Unicode字符,即不论中英文,每个字有两个字节组成。如果当前编译方式为ANSI(默认)方式,TCHAR等价于CHAR,如果为Unicode方式,TCHAR等价于WCHAR。在当前版本LPCSTR和LPSTR没区别,即以零结尾的字符串指针,相当于CHAR *。 LPSTR、LPCSTR相当于char *,所以这种类型变量的赋值等同于char *的赋值。

Ex1: LPSTR lpstrMsg = "I'm tired."; 
Ex2: char strMsg[]="I'm tired."; 
LPSTR lpstrMsg = (LPSTR) strMsg;

unsigned short * 和 char* : 一个是宽字符,一个是多字节,两种编码是不一样的。

如果你的程序要想在全球发布,一定要使用宽字符Unicode,

TChar strFileName[MAX_PATH] = TEXT("");
char strFileName[MAX_PATH]="";

TEXT就是L
有点象这样:
#define TEXT(str)   L##str
##是连接的意思就是将L和str联在一起了,表示宽字符。
L"Hello World",和"Hello World"是不同的,前一个占用24个char,后一个占用了12个char
如果定义了
#define UNICODE
TCHAR就代表宽字符wchar(2*sizeof(char)),否则TCHAR就代表char

也就是说在有
#define UNICODE 
的情况下

TChar strFileName[MAX_PATH] = TEXT(""); //代表定义了一个空的宽字符串
char strFileName[MAX_PATH]="";//代表定义了一个ASCII字符串

如果没有定义#define UNICODE那么
TChar strFileName[MAX_PATH] = TEXT(""); //编译器似乎会报错,没尝试过
char strFileName[MAX_PATH]="";//代表定义了一个ASCII字符串

int len=0; 
char *temp; 
strcpy(temp,"hello"); 
len=strlen(temp); 
char *unicodechar; //不一定是char*型,应该是什么型 
int unicodelen; 
//如何把temp=>unicodechar,并且长度为unicodechar的byte长度 
比如 
temp="a" len=1 
unicodechar=0x000x61 unicodelen=2;

将ANSI转换到Unicode 
(1)通过L这个宏来实现,例如: CLSIDFromProgID( L"MAPI.Folder",&clsid); 
(2)通过MultiByteToWideChar函数实现转换,例如: 
char *szProgID = "MAPI.Folder"; 
WCHAR szWideProgID[128]; 
CLSID clsid; 
long lLen = MultiByteToWideChar(CP_ACP,0,szProgID,strlen(szProgID),szWideProgID,sizeof(szWideProgID)); 
szWideProgID[lLen] = '/0'; 
(3)通过A2W宏来实现,例如: 
USES_CONVERSION; 
CLSIDFromProgID( A2W(szProgID),&clsid);

另外附上Windows API有关字符串类型的定义,常见的有这么几个

#define  LPSTR    char*

#define  LPCSTR  const char*

#define  LPTSTR  TCHAR*

#define  LPCTSTR  const TCHAR*

#define  LPWSTR   wchar_t*

#define  LPCWSTR  const wchar_t*

你仔细看一下就找到了规律,LP是指针,微软的传统,STR表示字符串,C表示const,T表示TCHAR,W表示wchar_t。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值