2017-12-04 7 views
1

低レベルの処理でstd :: stringsを扱っているので、その文字列のビットを操作する必要があります。
また、QPlainTextEditで結果を表示してGUIを使用して結果を表示する必要があります。逆処理のためにコピーされる可能性があります。
私は文字列を扱うので、0xe3のような結果が出る可能性があります。私はstd :: stringをQStringに変換してGUIに表示し、その逆も同様です。私は使用する、std :: stringをQStringの値を保持するように変換する方法とその逆?

QString::fromStdString(myString); // to convert std::string to QString 
myQString.toStdString();   // to convert back from QString to std::string 

問題は、値が文字列の処理から生じる場合です。それをQStringに変換して に変換しようとすると、値が変更されます。
私は、各文字の値を意味し、例えば、

0x3fをは0xbdなり、0xe3は、私は、問題が原因のstd :: stringとQStringの間のエンコーディングの問題はどうなると思います

0xEFというなり、私はそれに対処する方法やQStringから正しい値を取得する方法を理解できません。

+1

['QString' documentation](http://doc.qt。 'QString :: fromStdString()'に渡す 'std :: string'はUTF-8形式でなければならず、' QString :: toStdString() 'は' std :: string'はUTF-8形式です。 –

+1

'QString'はUnicode文字をUTF-16形式で保持します。' std :: string'から 'QString'への変換はUTF8-> UTF16変換を含み、' QString'から 'std :: string'への変換はUTF16 →UTF8変換。このような変換は無損失ですが、UTF-8形式の 'std :: string'を扱う準備ができていない場合、あなたが期待しているものではないかもしれません。 –

+1

あなたは 'QString'ではなく' QByteArray'との間で変換したいと思うように聞こえます。 – bnaecker

答えて

0

toStdStringおよびfromStdStringのメソッドがUTF-8を前提としているため、ソース文字列は有効な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までのすべての文字コードに対応する印刷可能なカスタム変換テーブルを作成する必要があります。

関連する問題