C++ 将QString转换为LPTSTR,只显示第一个字符
我正在尝试转换以下C++ 将QString转换为LPTSTR,只显示第一个字符,c++,qt,qstring,lptstr,C++,Qt,Qstring,Lptstr,我正在尝试转换以下QString: QString nom, prenom, promo; ... QString modelName = nom + "_" + prenom + "_" promo; 进入一个LPTSTR 到目前为止,我已经使用过: LPTSTR mm = (LPTSTR) modelName.utf16(); 但是返回的LPTSTR只包含QString的第一个字符。我尝试了很多方法,包括使用char*,但都没有效果 我应该怎么做才能将完整的QString放入LPTSTR
QString
:
QString nom, prenom, promo;
...
QString modelName = nom + "_" + prenom + "_" promo;
进入一个LPTSTR
到目前为止,我已经使用过:
LPTSTR mm = (LPTSTR) modelName.utf16();
但是返回的LPTSTR
只包含QString
的第一个字符。我尝试了很多方法,包括使用char*
,但都没有效果
我应该怎么做才能将完整的QString放入LPTSTR?如果LPTSTR mm=“TEST code”
运行良好,那么在您的项目中sizeof(TCHAR)==1
。ascii UTF16编码字符串的小端内存布局为:
xx 00 xx 00 xx 00 xx 00 ...
这就是为什么使用单字节TCHAR
,您的UTF-16字符串被解释为单个字符串。第一个零字节终止它
此问题有两种解决方案:
TCHAR
,需要为整个项目定义UNICODE
。您可以添加
DEFINES += UNICODE
添加到qmake项目文件,或添加
#define UNICODE
作为代码的第一行,在每个头文件和.cpp文件中TCHAR
,则需要按如下方式获取它们:
QString modelName = ...;
QByteArray modelNameLocal = modelName.toLocal8Bit();
LPTSTR mm = (LPTSTR)modelNameLocal.data();
只要modelNameLocal
在范围内,mm
值将保持有效。您需要小心确保只要使用mm
,底层字节数组也必须存在证明你只得到1的代码在哪里。性格您确定使用的是unicode win32 API吗?mm随后会写入我用另一个软件打开的文件中。在这封信里,我只能看到一个字母。但是当我直接输入名称时,LPTSTR mm=“TEST CODE”;它工作得很好。当您将字符串写入该文件时,我们如何确保您没有做错任何事情?但是,如果LPTSTR mm=“TEST CODE”起作用,则arn不会使用UNICODE#define进行编译,并且LPTSTR是8位字符,而不是16位字符。也许您需要modelName.toLocal8Bit()或modelName.toUtf8(),而不是我写的文件。我在调用软件提供的库中的一个函数,在我给它变量后,我不知道其中发生了什么。但是再一次,如果我直接在代码中填充mm,比如mm=“TEST”,它工作得很好。不,我不确定我使用的是unicode Win32 API。我怎么能检查呢?您应该注意,
modelName.utf16()
已无效,因此您不能将此指针存储在任何位置。@Rems您应该了解指针和数组之间的区别。因为有很多潜在的错误。库巴·奥伯很好地描述了一切+1@DmitrySazonov我实际上是C语言的初学者;我主要从事Java或Web(php)方面的工作,但我并不真正习惯所有这些细微之处。顺便谢谢你的帮助!