如何将STD :: String转换为QString保留值,反之亦然



我正在处理低级处理中的std :: strings,因此我必须操纵该字符串的字符的位。
也必须通过查看qplaintextedit上的结果来显示结果,因为它们可能会被复制以进行反向处理。
因此,我处理字符串,可能发生0xE3之类的结果。当我将std ::字符串转换为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中获得正确的值。

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

最新更新