Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将QString转换为LPTSTR,只显示第一个字符_C++_Qt_Qstring_Lptstr - Fatal编程技术网

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字符串被解释为单个字符串。第一个零字节终止它

此问题有两种解决方案:

  • 要使用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)方面的工作,但我并不真正习惯所有这些细微之处。顺便谢谢你的帮助!