我正在处理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中获取正确的值。
答案 0 :(得分:0)
源字符串无效UTF-8,因此往返失败,因为toStdString
和fromStdString
方法假定为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之间的每个字符代码提供可打印的等效表。