将QString转换为LPTSTR,只显示第一个字符

时间:2014-07-01 11:53:00

标签: 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

1 个答案:

答案 0 :(得分:2)

如果LPTSTR mm = "TEST CODE"效果很好,那么在您的项目中sizeof(TCHAR)==1。 ascii UTF16编码字符串的小端内存布局是:

xx 00 xx 00 xx 00 xx 00 ...

这就是为什么,使用单字节TCHAR,您的UTF-16字符串被解释为单个字符串。第一个零字节终止它。

这个问题有两种解决方案:

  1. 要使用UTF-16 TCHAR,您需要为整个项目定义UNICODE。您可以添加

    DEFINES += UNICODE
    

    到您的qmake项目文件,或添加

    #define UNICODE
    

    作为代码的第一行,在每个标题和.cpp文件中。

  2. 如果您真的希望使用本地编码的字节范围TCHAR,那么您需要按如下方式获取它们:

    QString modelName = ...;
    QByteArray modelNameLocal = modelName.toLocal8Bit();
    LPTSTR mm = (LPTSTR)modelNameLocal.data();
    

    只要mm在范围内,modelNameLocal值就会一直有效。您需要注意确保只要使用mm,基础字节数组也必须存在。