在cpp中将字符串转换为_T

convert string to _T in cpp

本文关键字:转换 字符串 cpp      更新时间:2023-10-16

我想将stringchar*转换为_T,但不能这样做。

如果我写

_tcscpy(cmdline,_T ("hello world")); 

效果很好,但是如果我写

char* msg="hello world";
_tcscpy(cmdline,_T (msg));

显示错误:error C2065: 'Lmsg' : undeclared identifier

请给我一个解决办法。

_T是一个宏,定义为(如果定义了UNICODE):

#define _T(a)  L ## a

只能用于字符串字面值。所以当你写_T("hi")时,它变成了L"hi",这是有效的,正如预期的那样。但是当你写_T(msg)的时候,它变成了Lmsg,这是一个未定义的标识符,而你并不想这样。

您所需要的是这个函数mbstowcs作为:

const char* msg="hello world"; //use const char*, instead of char*
wchar_t *wmsg = new wchar_t[strlen(msg)+1]; //memory allocation
mbstowcs(wmsg, msg, strlen(msg)+1);
//then use wmsg instead of msg
_tcscpy(cmdline, wmsg);
//memory deallocation - must do to avoid memory leak!
 delete []wmsg;

_T仅适用于字符串字面值。如果代码是用Unicode支持编译的,它所做的就是将字面量转换为L""字符串,否则就不管它了。

看看http://msdn.microsoft.com/en-us/library/dybsewaf(v=vs.80).aspx

你需要使用mbtowcs函数

_T是一个宏,它通过在UNICODE版本的字面值之前添加L来将字符串字面值转换为宽字符字符串字面值。

换句话说,当您编写_T("Hello")时,就好像您在ANSI构建中编写了"Hello"或在UNICODE构建中编写了L"Hello"。结果表达式的类型分别为char*wchar_t*

_T 不能将字符串变量 (std::stringchar*)转换为wchar_t*—为此,您必须使用mbstowcsMultiByteToWideChar之类的函数。

建议:对你来说,总是做一个UNICODE构建而忘记_T, TCHAR和所有其他T衍生物会容易得多(而且不会更糟)。

_T不是一个实际类型。这是一个宏,在字符串文本前加上L,使它们成为wchar_t* s而不是char*。如果您需要在运行时将char*字符串转换为wchar_t*字符串,则需要mbtowcs。

_T修饰符只是一个声明,告诉编译器必须将字符串文字解释为utf-16编码。它对变量不起作用的原因是该变量的内容已经被声明为ascii。

如前所述,mbstowcs函数是执行将字符数据转换为utf-16(宽字符)数据所需的。