如何将std :: string转换为QString保留值,反之亦然?

时间:2017-12-04 22:20:01

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

我正在处理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中获取正确的值。

1 个答案:

答案 0 :(得分:0)

源字符串无效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之间的每个字符代码提供可打印的等效表。