VC++ WCHAR,CHAR,TCHAR的区别
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的区别相关推荐
- WCHAR,CHAR,TCHAR的区别
现在C++的字符分成两种类型wchar_t和char. 其中 WCHAR==wchar_t,CHAR==char. TCHAR是一种条件编译的类型,根据条件可以代表wchar_t或char ...
- VC中char,TCHAR,WCHAR总结
char,TCHAR,WCHAR区别 #ifdef UNICODE typedef wchar_t TCHAR; #else typedef unsigned char TCHAR; #endif t ...
- [转]VC中char,TCHAR,WCHAR总结
char,TCHAR,WCHAR区别 #ifdef UNICODE typedef wchar_t TCHAR; #else typedef unsigned ...
- char,TCHAR,WCHAR区别
#ifdef UNICODE typedef wchar_t TCHAR; #else typedef unsigned ...
- VC中_T()与L区别(转)
VC中_T("")与L区别 区别解释 一说这个话题,肯定涉及MS的字符集,先看MS对_T(其中_TEXT(")与_T("")一样)的定义: [cpp] ...
- char *s和char s[]的区别与联系以及strlen()和sizeof()的用法
#include<iostream> using namespace std;void reverse(char s[]) {char *p, *q, temp;p = s;//p指向字符 ...
- char和uchar区别
char和uchar区别 char 是有符号的, uchar(unsigned char)是无符号的! 1.作为字符来表示的话,两者没有什么区别! 2.作为整数来表示的话,由于char是有符号的,于是 ...
- 数据库中的字段varchar类型和char类型的区别?
数据库中的字段varchar类型和char类型的区别? 目录 数据库中的字段varchar类型和char类型的区别?
- char str[]与char *str的区别
一个具体例子: main() {char *p="abc123ABC";//char p[]="abc123ABC"int i=0;while(*(p+i)!= ...
最新文章
- oracle trace文件解读
- 国内CRM市场的运作猜想
- SAP Cloud Connector里的virtual host和internal host有什么区别
- php的list函数
- 用友 无法正确解析服务器,用友T3软件登陆软件时提示:“可能无法正确解析服务器名称或者相应的端口被禁用,请尝试输入服务器的IP地址”?...
- dedecms织梦(一)
- ORACLE RAC心跳网络
- 虚拟机的安装中遇到的问题(WIN10主机)
- 使用Java代码发送邮件
- 显示器U2518怎么连服务器,工作游戏两不误,戴尔 U2518D显示器太划算-双显示器设置...
- 北斗/RTK高精度定位系统的优势及适用场景
- 2019-CS224n-Assignment1
- godot 以 WebAssembly 为目标平台编译导出模板
- 如何让语音芯片与功放芯片之间更好地配合让音效更好
- java prase xml error
- 解决黑苹果和Windows双系统时,时钟不同步的问题
- 易语言让按钮支持回车键操作
- 必看!Java 学习路线
- LA/NMP架构的介绍
- leetcode 974. Subarray Sums Divisible by K的解法(统计共同余数)
热门文章
- Absurdity and wonder: Heath Robinson at home
- NXP JN5189 ZigBee 3.0开发环境搭建(续)
- Adaptive large neighborhood search Heuristics for the vehicle routing problem with stochastic deman
- 分享几个免费书籍的网站
- SMS发送WapPush
- FleaPHP 学习笔记1
- 分布式存储系统——HBase
- InnoSetup制作补丁包替换文件操作
- 无法打开到主机的连接。 在端口 23: 连接失败
- 数据库的设计步骤(好文)