我在低级处理中处理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之后,尝试
转换回去,值改变。
我的意思是每个字符的值,例如



我猜问题是由于std::string和QString之间的编码问题而发生的,但是我无法弄清楚如何处理它或如何从QString获取正确的值。

最佳答案

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

关于c++ - 如何将std::string转换为QString保留值,反之亦然?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47642929/

10-11 23:16
查看更多