我正在尝试转换以下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
    

    作为代码的第一行,在每个 header 和.cpp文件中。
  • 如果您确实希望使用本地编码的字节宽TCHAR,则需要按以下方式获取它们:
    QString modelName = ...;
    QByteArray modelNameLocal = modelName.toLocal8Bit();
    LPTSTR mm = (LPTSTR)modelNameLocal.data();
    

    只要mm在范围内,modelNameLocal值将保持有效。您需要小心确保只要使用mm,底层字节数组也必须存在。
  • 10-08 06:31