我想将string
或char*
转换为_T
但无法做到。
如果我写
_tcscpy(cmdline,_T ("hello world"));
它完美无缺,但如果我写的话
char* msg="hello world";
_tcscpy(cmdline,_T (msg));
它显示如下错误:error C2065: 'Lmsg' : undeclared identifier
请给我一个解决方案。
提前完成。
答案 0 :(得分:10)
_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;
答案 1 :(得分:3)
_T
仅适用于字符串文字。如果代码是使用Unicode支持编译的话,它所做的只是将文字转换为L""
字符串,否则就不管它。
查看http://msdn.microsoft.com/en-us/library/dybsewaf(v=vs.80).aspx
答案 2 :(得分:2)
您需要使用mbtowcs功能。
您还应该查看this article。
答案 3 :(得分:2)
_T
是一个宏,它通过在L
版本中的文字前面加UNICODE
来使字符串文字成为宽字符串文字。
换句话说,当您编写_T("Hello")
时,就好像您已在ANSI版本上编写"Hello"
或在UNICODE版本上编写L"Hello"
。结果表达式的类型分别为char*
或wchar_t*
。
_T
无法将字符串变量(std::string
或char*
)转换为wchar_t*
- 为此,您必须使用mbstowcs
或MultiByteToWideChar
等函数。
建议:对于您(并且绝不会更糟)总是进行UNICODE构建并忘记_T
,TCHAR
和所有其他{{} {1}} - 衍生物。只需在任何地方使用宽字符串。
答案 4 :(得分:2)
_T
不是实际类型。这是一个宏,它使用L
添加字符串文字,这样它们就是wchar_t*
而不是char*
。如果您需要在运行时将char*
字符串转换为wchar_t*
字符串,则需要mbtowcs。
答案 5 :(得分:1)
_T修饰符只是一个声明,告诉编译器必须将字符串文字解释为utf-16编码。它不适用于变量的原因是因为该变量的内容已经声明为ascii。
如前所述,mbstowcs函数是执行将char数据转换为utf-16(宽字符)数据所需的函数。