【发布时间】: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 中获取正确的值。
【问题讨论】:
-
如果你读到
QStringdocumentation,你传递给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