在cpp中将字符串转换为_T
convert string to _T in cpp
我想将string
或char*
转换为_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::string
或char*
)转换为wchar_t*
—为此,您必须使用mbstowcs
或MultiByteToWideChar
之类的函数。
建议:对你来说,总是做一个UNICODE构建而忘记_T
, TCHAR
和所有其他T
衍生物会容易得多(而且不会更糟)。
_T
不是一个实际类型。这是一个宏,在字符串文本前加上L
,使它们成为wchar_t*
s而不是char*
。如果您需要在运行时将char*
字符串转换为wchar_t*
字符串,则需要mbtowcs。
_T修饰符只是一个声明,告诉编译器必须将字符串文字解释为utf-16编码。它对变量不起作用的原因是该变量的内容已经被声明为ascii。
如前所述,mbstowcs函数是执行将字符数据转换为utf-16(宽字符)数据所需的。
- wcstombs_s(),转换字符串的长度
- 使用 CStringW/CStringA 和 CT2W/CT2A 转换字符串有什么区别?
- 无法转换字符串插入函数的参数
- 转换字符串向量:基于先前的值跳过元素
- 从中间器转换字符串不起作用,出了什么问题?
- 失败的证明转换字符串到枚举类
- 如何使用正则表达式和提升转换迭代器标记和转换 c 字符串
- 使用java jni时转换字符串类型
- 如何避免在转换字符串令牌流时重复istringstream构造
- 阿托伊未正确转换字符串
- C++,转换字符串,使连续下划线序列变为单个下划线
- 使用长算术转换字符串
- 转换字符串十进制数时的精度
- 将词法转换字符串提升为双精度
- 使用marshal_as函数转换字符串的性能
- C++不会从数据转换字符串
- 无论如何,在c++ /Qt中转换字符串到结构中的字段
- C++ 隐式类型转换字符串 -> int?
- 转换字符串到浮点数,c++实现
- 用于转换字符串大小写的函数