【问题标题】:Qt - How to convert QString to char (NOT char*)Qt - 如何将 QString 转换为 char(不是 char*)
【发布时间】:2014-08-17 20:26:19
【问题描述】:

这似乎应该是一件相当简单的事情,但我很难弄清楚如何去做。基本上我只有一个 QString 对象,它总是一个字符(特别是一个字母)长,我需要将它转换为 char 以将其设置为我的该类型类中的对象。我知道如何使用QString("myTextHere").toStdString.c_str() 将其设为char*,但需要将值设置为的对象不是char*,而是char。有没有办法做到这一点?谢谢!

【问题讨论】:

  • 请记住,std::string 表示是一种特定的编码 - 多字节 UTF-8 编码,其中一个代码点可能需要许多 char 代码单元。那么,首先,您如何保证字符串中的第一个代码点甚至可以表示为单个 UTF-8 字符?当然,您总是可以先将其转换为 latin1,但我看不到您这样做。

标签: c++ qt type-conversion


【解决方案1】:

如果您遇到错误,这对我有用

错误:必须调用对非静态成员函数的引用;你是否 是指不带参数调用它?

QString mystr = "mystring";
char myvar = mystr.toStdString().c_str()[0];

【讨论】:

    【解决方案2】:

    使用索引运算符获取字符串的第一个字符:

    QString("myTextHere").toStdString()[0]
    

    但是,没有必要转换为std::string,所以下面是一个更好的主意:

    主要问题是QString 是UTF-16 并且包含QChars,两个字节的字符。如果您的角色可以使用 latin-1 字符集来表示,您应该使用

    char ch = QString("myTextHere")[0].latin1();
    

    否则您需要更大的类型(注意:即使这样会将非 BMP 字符减半):

    int i = QString("myTextHere")[0].unicode();
    

    【讨论】:

    • 感谢您的回复,但是当我尝试此操作时,我收到一条错误消息“无法从 'QCharRef' 转换为 'char'”,有没有办法解决这个问题?
    • @thnkwthprtls 已修复和扩展。
    【解决方案3】:

    正如其他人所说,使用 QString::operator[]。在 QString 上使用它会返回一个 QCharRef,一个等效于 QChar 的辅助类。由于 QChar 旨在支持 unicode 字符,因此只有一个进一步的规范。来自 qt 文档 (4.7) 中的 QChar:

    QChar 提供构造函数和强制转换运算符,使 与传统的 8 位字符相互转换。如果你定义 QT_NO_CAST_FROM_ASCII 和 QT_NO_CAST_TO_ASCII,如 QString 文档,您需要显式调用 fromAscii() 或 fromLatin1(),或使用 QLatin1Char,从 8 位构造 QChar char,你需要调用 toAscii() 或 toLatin1() 来获取 返回 8 位值。

    我的 Qt 版本不允许

    char c = QString("myTextHere")[0];

    我会使用

    char c = QString("myTextHere")[0].toAscii();

    【讨论】:

      【解决方案4】:

      如果您声称这会返回一个 char*:

      QString("myTextHere").toStdString.c_str();
      

      那么显然,这将得到第一个字符,即char:

      QString("myTextHere").toStdString.c_str()[0];
      

      它可能看起来不漂亮,并且可能有更好的方法来获取第一个字符,但根据定义,这段代码应该(可能必须)工作。

      【讨论】:

      • @thnkwthprtls 不仅接受自己的答案完全没问题,而且这个答案是迄今为止所有答案中最糟糕的两个,因为它有三个问题:1. 强制重新编码将 UTF-16 QString 转换为 UTF-8 std::string。 2.分配说std::string。 3. 不提供处理在 UTF-8 中没有单个代码单元表示并形成 UTF-8 代理项的非 latin1 字符的方法。
      【解决方案5】:

      我很确定我找到了一种方法来转换值而不会出现关于 QCharRef 的错误,我发现如果我使用QString::at() 函数来获取第一个索引而不是QString("myText")[0],然后使用toAscii()在那个值上,它似乎可以工作并产生我想要的正确值。换句话说,这就是我所做的:

      char c = QString("A").at(0).toAscii();
      

      【讨论】:

      • 如果您希望此解决方案具有通用性,从而适用于任何字符,您必须记住 QChar 是 UTF-16 编码中的代码单元,而不是代码点。因此,QChar 可能是 UTF-16 代理的一部分。当然,如果您只想转换为 ascii,这并不重要,但应该牢记这一点。
      • 给出错误:“QChar”中没有名为“toAscii”的成员
      • 现在它已被QChar::toLatin1() 取代,但鉴于QStrings 基本上是UTF-16BE 编码,您应该真正检查一下QString(...).at(0).isHighSurrogate() 是否为@ 987654331@,如果是这样,请使用QChar::surrogateToUcs4(QString(...).at(0), QString(...).at(1))(假设您确实有两个QChars {a 代理对}可以处理) - 或@ 987654336@...).at(0).unicode() 否则...
      猜你喜欢
      • 2020-04-20
      • 2012-11-04
      • 1970-01-01
      • 2020-11-13
      • 2014-01-16
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 2021-11-16
      相关资源
      最近更新 更多