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);

char to TCHAR , TCHAR to char

在编写Wince程序时,遇到了一个问题如下:有的函数的返回值是char型的,如何将其转换成Tchar型,比如列举注册表函数RegEnumValue()返回的值中,有一个返回值是得到指定键的值。它是BYTE(unsigned char)型的,如何将其很容易的转成Tchar型,用了函数MultiByteToWideChar(),但是总是只转第一个字符,不知道哪里出了问题?
答:可以把BYTE的值赋给CString变量,再用wcscpy函数把CString变量的值赋给TCHAR数组。
ANSI to Unicode:
--------------------------------------------------
char *pAnsiString = "Some test string";
CString strUnicode = pAnsiString;
---------------------------------------------------

如何把 char 转为lpctstr
mbstowcs---Convert a multi-byte(ANSI) string to wide character stirng(Unicode).
wcstombs---Convert a wide character string to multi-byte string.

--------------------------------------------------

cstring TCHAR的互相转换

cstring->TCHAR*的转化可以用函数GetBuff()

函数原型为:LPTSTR GetBuffer( int nMinBufLength );
cstring str("cstring");
TCHAR* szMsg = new TCHAR[100];
//其参数为cstring字符串的长度
szMsg = str.GetBuffer(str.GetLength());
str.ReleaseBuffer();
delete []szMsg;
szMsg = NULL;

TCHAR*->cstring的转化

TCHAR szTchar[18] = L"TCHAR";  
cstring str;  
str.Format(_T("%s"),szTchar);
-------------------------------------------------------------
Unicode to ANSI:
char* GetAnsiString(const CString &s)
{
int nSize = s.GetLength();
char *pAnsiString = new char[nSize+1];
wcstombs(pAnsiString, s, nSize+1);
return pAnsiString;
}
CString strUnicode = _T("Some test string");
char *pAnsiString = GetAnsiString(strUnicode);

VC++ WCHAR,CHAR,TCHAR的区别相关推荐

  1. WCHAR,CHAR,TCHAR的区别

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

  2. VC中char,TCHAR,WCHAR总结

    char,TCHAR,WCHAR区别 #ifdef UNICODE typedef wchar_t TCHAR; #else typedef unsigned char TCHAR; #endif t ...

  3. [转]VC中char,TCHAR,WCHAR总结

    char,TCHAR,WCHAR区别 #ifdef   UNICODE      typedef   wchar_t   TCHAR; #else      typedef   unsigned   ...

  4. char,TCHAR,WCHAR区别

    #ifdef   UNICODE                typedef   wchar_t   TCHAR; #else                typedef   unsigned   ...

  5. VC中_T()与L区别(转)

    VC中_T("")与L区别 区别解释 一说这个话题,肯定涉及MS的字符集,先看MS对_T(其中_TEXT(")与_T("")一样)的定义: [cpp] ...

  6. char *s和char s[]的区别与联系以及strlen()和sizeof()的用法

    #include<iostream> using namespace std;void reverse(char s[]) {char *p, *q, temp;p = s;//p指向字符 ...

  7. char和uchar区别

    char和uchar区别 char 是有符号的, uchar(unsigned char)是无符号的! 1.作为字符来表示的话,两者没有什么区别! 2.作为整数来表示的话,由于char是有符号的,于是 ...

  8. 数据库中的字段varchar类型和char类型的区别?

    数据库中的字段varchar类型和char类型的区别? 目录 数据库中的字段varchar类型和char类型的区别?

  9. char str[]与char *str的区别

    一个具体例子: main() {char *p="abc123ABC";//char p[]="abc123ABC"int i=0;while(*(p+i)!= ...

最新文章

  1. oracle trace文件解读
  2. 国内CRM市场的运作猜想
  3. SAP Cloud Connector里的virtual host和internal host有什么区别
  4. php的list函数
  5. 用友 无法正确解析服务器,用友T3软件登陆软件时提示:“可能无法正确解析服务器名称或者相应的端口被禁用,请尝试输入服务器的IP地址”?...
  6. dedecms织梦(一)
  7. ORACLE RAC心跳网络
  8. 虚拟机的安装中遇到的问题(WIN10主机)
  9. 使用Java代码发送邮件
  10. 显示器U2518怎么连服务器,工作游戏两不误,戴尔 U2518D显示器太划算-双显示器设置...
  11. 北斗/RTK高精度定位系统的优势及适用场景
  12. 2019-CS224n-Assignment1
  13. godot 以 WebAssembly 为目标平台编译导出模板
  14. 如何让语音芯片与功放芯片之间更好地配合让音效更好
  15. java prase xml error
  16. 解决黑苹果和Windows双系统时,时钟不同步的问题
  17. 易语言让按钮支持回车键操作
  18. 必看!Java 学习路线
  19. LA/NMP架构的介绍
  20. leetcode 974. Subarray Sums Divisible by K的解法(统计共同余数)

热门文章

  1. Absurdity and wonder: Heath Robinson at home
  2. NXP JN5189 ZigBee 3.0开发环境搭建(续)
  3. Adaptive large neighborhood search Heuristics for the vehicle routing problem with stochastic deman
  4. 分享几个免费书籍的网站
  5. SMS发送WapPush
  6. FleaPHP 学习笔记1
  7. 分布式存储系统——HBase
  8. InnoSetup制作补丁包替换文件操作
  9. 无法打开到主机的连接。 在端口 23: 连接失败
  10. 数据库的设计步骤(好文)