分享

有关VC中的字符以及字符串Tchar,char,wchar

 灞河之滨 2018-12-12

 1.string

typedef basic_string string;

The type describes specialization of template class basic_string for elements of type char.

译:这个类型为类型char类型定义了一个特定的类模板string。

 

2.wchar_t

 

The wchar_t keyword designates wide_character type.

译:wchar_t是一个宽的类型

 

还可以在MSDN关于wchar_t的Remarks中看到

1.wchar_t类型被MIDL定义成一个16位的无符号型的short.

2.wchar_t允许重新定义,只要和之前的定义保持一致;wchar_t可以作为const的声明.

3.在wchar_t前使用L字符或用一个string常量来指定wchar_t常量.

 

char

The char keyword specifies an-bit data item.

译:char关键字指定一个8位的数据项.

Remardk(附注)

1.默认情况下char等同于unsigned char.

 

CString

1.CString没有基类.

2.一个CString对象由可变长度的有序的字符组成;CString提供函数和运算符的语法类似于Basic.

3.CString是基于TCHAR的数据类型,如果你的程序定义为UNICODE的,那么TCHAR定义为wchar_t,wchar_t为(16位的字符类型);否则,TCHAR定义为char(8位的字符类型).在Unicode下,CString对象由16位的字符组成。不在Uniconde情况下,CString由8位长的字符组成。

 

TCHAR

如果你的程序定义为UNICODE的,那么TCHAR定义为wchar_t,wchar_t为(16位的字符类型);否则,TCHAR定义为char(8位的字符类型).在Unicode下,CString对象由16位的字符组成。不在Uniconde情况下,CString由8位长的字符组成。

 

 

 

 

总结:char为8位长的字符类型,wchar_t(宽字符)为16位长的字符类型,TCHAR及CString如上所述。

 

下面用一些代码能更好的说明问题:

1.

#include 
using namespace std;

int main(void)
{
 printf("wchar_t: %d/n", sizeof(wchar_t));
 printf("char: %d/n", sizeof(char));
 
 return 0;
}

 

输出:2

         1

 

2.

LPSTR char 
LPCSTR const char 
LPWSTR wchar_t 
LPCWSTR const wchar_t 
LPOLESTR OLECHAR BSTR LPWSTR(Win32) 
LPCOLESTR const OLECHAR LPCWSTR(Win32) 
LPTSTR _TCHAR 
LPCTSTR const _TCHAR *

 

3.Unicode

一种字符编码体系,它对每个字符都用两个字节来表示,不管是否是ASCII字符。这种编码体系得到Microsoft Windows NT平台的支持,并在32位ActiveX技术中得以利用。国际标准化组织(ISO)字符标准。Uniconde使用16位(2字节)编码反感,允许65,536个不同的字符空间。Unicode包含标点符号,数学符号,修饰符号等的表示。

 

ASCII字符集

美国标准信息交换码(American Standard Code for Information Interchange) 的缩写,7位字符集,广泛用于表示标准U.S.键盘上的字母和符号。ASCII字符集与ANSI字符集的前128个字符(0到127)相同。码值从0到255,代表了字母,数字,标点符号和其他字符,ASCII码是一种标准化的编码,用以在计算机之间或计算机与外围设备之间的交换信息。

 

另附上CString转char的函数

void CString2Char(CString str, char ch[])  

     int i;  
     char *tmpch;  
     int wLen WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL);//得到Char的长度  
     tmpch new char[wLen 1];                                             //分配变量的地址大小  
     WideCharToMultiByte(CP_ACP, 0, str, -1, tmpch, wLen, NULL, NULL);       //将CString转换成char*  
     for(i 0; tmpch[i] != '/0'; i++) ch[i] tmpch[i]; 

         ch[i] '/0';  
}


比如在调用setwindowtext时,第二个参数用char[]会出错,建议使用TCHAR,因为vc2005默认为unicode。

前面提到在Unicode模式下使用TCHAR(16位w_char),不要用char。 

MultiByteToWideChar函数提供了一个从非unicode到unicode字符的转换,也就是说从8位Tchar到16位Tchar。

在从非unicode的代码整体转换为unicode代码(如从VC6移植到VC2005或VC2010时应注意多注意宽字符集的问题)常常会因此而报错,所以,我们注意对字符及字符串进行相应的处理,如:1:字符串前要加上_T或者_TEXT.比如:_T(“dadad”);
2:将char换成TCHAR (unsigned char必须去掉unsigned)
3:将str函数换成_tcs函数
4:printf函数族必须修改为wprintf,不过要注意千万不要使用wprintf函数来解析char型.
5:对于字符串和整型的转换,尽量使用_itot和_ttoi来进行相互转化,不要使用atoi或itoa。
unicode方式下CString与wchar_t是通用的 
就是说在vs2005中, 
WCHAR str=L"字符串"; 
CString str1=str; 
是可以通过编译的,但到vc6中就不可以了 
 :字符串声明类型。一般使用通用即可,让程序自动根据所设的编码进行设定。
 

 

通用 MFC 数据类型

 

 

映射到 ASCII

 

 

映射到 UNICODE

 

 

注释

 

 

_TCHAR,char,wchar_t三者的关系

 

 

_TCHAR 是一个映射宏,当定义 UNICODE 时,该数据类型映射到 wchar_t,如果没有定义 UNICODE,那么它映射到 char。

 

 

_T 或 _TEXT

 

 

char 常量字符串

 

 

wchar_t 常量字符串

 

 

功能与宏相同,在 ASCII 模式下,它们被忽略,也就是说被预处理器删除掉,但是如果定义了UNICODE, 则它们会将常量字符串转换成等价的 UNICODE 

 

 

LPTSTR

 

 

char*, LPSTR(Win32)

 

 

wchar_t*

 

 

可移植的32位字符串指针。它将字符类型映射到工程设置的类型。

 

 

LPCTSTR

 

 

const char*, LPCSTR(Win32)

 

 

const wchar_t*

 

 

可移植的32位常量字符串指针。它将字符类型常量映射到工程设置的类型。

 

 2. UNICODE WCHAR*到 char 
CString str(wchar*);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
LPCSTR      32-bit  指针,指向一个常量字串  LPSTR        32-bit  指针,指向一个字串  LPCTSTR      32-bit  指针,指向一个常量字串。此字串可移植到Unicode  和DBCS  LPTSTR      32-bit  指针,指向一个字串。此字串可移植到Unicode  和DBCS 
LPWSTR      32-bit  指针,指向一个unicode字符串的指针  LPCWSTR      32-bit  指针, 指向一个unicode字符串常量的指针  前面的L代表LONG,P就是指针的意思,C就是constant的意思, W是wide的意思,STR就是string的意思

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多