【问题标题】:How to convert QString to LPCSTR (Unicode)如何将 QString 转换为 LPCSTR (Unicode)
【发布时间】:2011-07-23 13:02:31
【问题描述】:

如何将 QString 转换为 LPCSTR ?

#ifdef UNICODE 已定义和未定义时如何处理?

非常感谢:)

【问题讨论】:

    标签: c++ windows qt qt4 lpcstr


    【解决方案1】:

    我猜:

    QString str("ddddd");
    LPCSTR lstr = str.toStdString().c_str();
    

    【讨论】:

    • 如果 LPCSTR 是 const char*
    • LPCSTR 始终定义为 char*。您将它与 LPCTSTR(注意 T)混淆了,它可以映射到 const char*const wchar_t*,具体取决于是否定义了 UNICODE
    【解决方案2】:

    QString可以一直保存Unicode; LPCSTR 绝不是 Unicode。这意味着您必须考虑如何处理不适合的字符。这不是“使用哪种方法”的问题,而是设计问题。

    很有可能在您的特定情况下,您绝对知道 QString 仅包含本地“ANSI”代码页(也称为 ACP)中的字符。在这种情况下,正确的函数是QString::toLocal8Bit ()

    或者,您可能知道QString 仅包含来自 Latin1 (ISO 8859-1) 的字符。在这种情况下,正确的函数是QString::toLatin1()

    您可以尝试拨打QString::toUtf8()。即使QString 包含所有Unicode 字符,这也将始终生成有效的字节数组。但是,从形式上讲,您不能将 LPCSTR 指向它:UTF-8 不是有效的 ACP 代码页。据推测,您希望此 LPCSTR 传递给您无法控制的另一个函数。该函数可能不会期望 UTF-8。如果它完全需要 Unicode,则需要 LPCWSTR

    【讨论】:

      【解决方案3】:

      我从here 找到了以下解决方案,它对我来说完美无缺:

      void fooSub(LPSTSTR X); // this is our function :-)
      
      foo()
      {
          QString text;
          if(sizeof(TCHAR) == 1)
              fooSub((LPCSTR)text.toLocal8Bit().constData()); // here you have to check, how to convert, you could also use utf8(), ...
          else
              fooSub((LPCWSTR)text.utf16());
      }
      

      【讨论】:

        【解决方案4】:
        LPCSTR == const char *
        

        它不是unicode,那么

        LPCSTR s = (const char *)qtString;

        【讨论】:

        • 你误解了这个问题!
        • 我不认为 (const char*)qtString 转换得很好。
        • AFAIK LPCSTR 被定义为 TCHAR*。 TCHAR 根据 UNICODE 设置定义为 WCHAR 或 CHAR。
        • WinNT.h 中的声明:typedef __nullterminated CONST CHAR *LPCSTR, *PCSTR;
        • @Seba:你想的是LPCTSTR
        猜你喜欢
        • 2011-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-15
        • 1970-01-01
        • 2015-01-17
        • 1970-01-01
        • 2021-11-17
        相关资源
        最近更新 更多