【问题标题】:Convert QString to LPTSTR, only first character shows up将 QString 转换为 LPTSTR,只显示第一个字符
【发布时间】:2014-07-01 11:53:00
【问题描述】:

我正在尝试转换以下QString

QString nom, prenom, promo;
...
QString modelName = nom + "_" + prenom + "_" promo;

转为LPTSTR

到目前为止,我已经使用了这个:

LPTSTR mm = (LPTSTR) modelName.utf16();

但是返回的LPTSTR 只包含QString 的第一个字符。我尝试了很多方法,包括通过char *,但没有任何效果。

我应该怎么做才能将完整的 QString 放入 LPTSTR

【问题讨论】:

  • 证明你只能得到 1. 字符的代码在哪里?你确定你使用的是 unicode win32 API 吗?
  • mm 之后被写入我用另一个软件打开的文件中。在这一个中,我只能看到一个字母。但是当我直接输入名字时,LPTSTR mm = "TEST CODE";它工作得很好。
  • 当您将字符串写入该文件时,我们如何确定您没有做错任何事情?但是,如果 LPTSTR mm = "TEST CODE" 有效,则您无法使用 UNICODE #define 进行编译,并且您的 LPTSTR 是 8 位字符,而不是 16 位字符。也许您需要 modelName.toLocal8Bit() 或 modelName.toUtf8()。
  • 我不是写文件的人。我正在调用软件提供的库中的一个函数,但我不知道它发生了什么,我给它一个变量。但是再一次,如果我直接在代码中填写 mm,比如 mm = "TEST",它就可以正常工作。不,我不确定我使用的是 unicode Win32 API。我怎么能检查呢?
  • 您应该注意,modelName.utf16() 已失效,因此您不能将此指针存储在任何地方。

标签: c++ qt qstring lptstr


【解决方案1】:

如果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();
    

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

【讨论】:

  • @Rems 你应该明白指针和数组的区别。因为有很多潜在的错误。 Kuba Ober 很好地描述了一切。 +1
  • @DmitrySazonov 我实际上是 C 的初学者;我主要从事 Java 或 Web (php) 方面的工作,但我并不真正习惯所有这些微妙之处。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-03
  • 1970-01-01
  • 2010-09-25
  • 2017-01-30
  • 2021-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多