【问题标题】:How to convert std::string to QString preserving values and vice versa?如何将 std::string 转换为 QString 保留值,反之亦然?
【发布时间】:2018-05-18 11:35:46
【问题描述】:

我正在处理 std::strings,在低级处理中,所以我必须操作该字符串的字符位。
我还必须通过在 QPlainTextEdit 上查看结果来使用 GUI 显示结果,因为它们可能会被复制以进行逆向处理。
所以我处理字符串,可能会出现 0xe3 这样的结果。当我将 std::string 转换为 QString 以显示在 GUI 中时,反之亦然。我用,

 QString::fromStdString(myString); // to convert std::string to QString
 myQString.toStdString();          // to convert back from QString to std::string

问题是当值是对字符串进行处理时产生的。将其转换为 QString 并尝试 将其转换回来,值会改变。
我的意思是每个字符的值,例如

0x3f 变成 0xbd,0xe3 变成 0xef

我猜这个问题是由于 std::string 和 QString 之间的编码问题造成的,但我不知道如何处理它或如何从 QString 中获取正确的值。

【问题讨论】:

  • 如果你读到QString documentation,你传递给QString::fromStdString()std::string必须是UTF-8格式,而QString::toStdString()返回一个std::string是UTF-8格式。
  • QString 保存 UTF-16 格式的 Unicode 字符,其中从 std::string 转换为 QString 涉及 UTF8->UTF16 转换,从 QString 转换为 std::string 涉及UTF16->UTF8 转换。此类转换是无损的,但如果您不准备处理 UTF-8 格式的std::string,则可能不是您所期望的。
  • 听起来您想转换为QByteArray,而不是QString
  • @RemyLebeau 谢谢,我明白了。但我主要关心保留它们的值,以便我可以将它们取回以 8 位字符类型表示,即我想从 QString 取回 0xe3 和其他非 ASCII 值。我还必须呈现这些无意义的字符,以便任何人都可以复制它们,并在再次呈现给程序时。它应该再次识别这些值。即使有一些中间阶段也可以。
  • @Ammar:UTF 之间的转换是无损的。如果您丢失数据,则意味着您一开始就没有正确转换数据。请edit您的问题提供minimal reproducible example,以证明您的问题在行动。例如,0xE3 在 UTF-8 编码的std::string 中本身就不是一个有效的字符。如果你有 Unicode 字符 U+00E3 (LATIN SMALL LETTER A WITH TILDE),它在 UTF-8 中被编码为 0xC3 0xA3

标签: c++ string qt c++11


【解决方案1】:

源字符串不是有效的 UTF-8,因此往返失败,因为 toStdStringfromStdString 方法采用 UTF-8。 Latin-1 往返不应该失败,应该简单地将字节 0-255 映射到 Unicode C0 和 C1。代码有点冗长:

void test(const std::string & input) {
  auto latin_input = QByteArray::fromStdString(input);
  auto string = QString::fromLatin1(latin_input);
  auto latin_output = string.toLatin1();
  Q_ASSERT(latin_input == latin_output);
  auto output = latin_output.toStdString();
  Q_ASSERT(input == output);
}

请注意,许多 Latin-1 字符是不可打印的,因此 QPlainTextEdit 不会显示它们!要解决此问题,您需要创建一个自定义转换表,为 0 到 255 之间的每个字符代码提供可打印的等效项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-03
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多