2016-07-23 17 views
2

私は戻ってQStringのに続いQByteArrayにQStringのやから形質転換のに問題があります:あなたは私は16ビットの範囲内にあるすべての文字でのQStringを埋める見ることができるようにQByteArrayへのQtのQStringとバック

int main() { 

    QString s; 

    for(int i = 0; i < 65536; i++) { 
     s.append(QChar(i)); 
    } 

    QByteArray ba = s.toUtf8(); 

    QString s1 = QString::fromUtf8(ba); 

    if(areSame(s, s1)) { 
     qDebug() << "OK"; 
    } else { 
     qDebug() << "FAIL"; 
     outputErrors(s, s1); 
    } 

    return 0; 
} 

を。 QByteArray(Utf8)に変換してQStringに戻します。問題は、値が0の文字と値が55295より大きい文字がQStringに変換されないことです。

範囲1〜< 55297の範囲内であれば、このテストに合格します。

+0

それは – user4759923

+0

は「\ 0」を忘れてしまったが、それでも、私は他の値に問題があることを理解していない動作しないことは明らかですので、0文字は、文字列を終了します。 – JanSLO

+0

多分これらのユニコード文字は実装されていません – user4759923

答えて

3

55296(0xD800)から57343(0xdfff)までの文字はsurrogate charactersです。 それはそれの後の文字のエスケープ文字として見ることができます。彼らはそれ自体意味がありません。

// QChar(0) was omitted so s and s1 start with QChar(1) 
for (int i = 1 ; i < 65536 ; i++) 
{ 
    qDebug() << i << QChar(i) << s[i-1] << s1[i-1] << (s[i-1] == s1[i-1]); 
} 
+0

私が間違っている場合は私を修正しますが、文字列はまだ等しくないでしょうか? – tofiffe

+1

QString :: toUtf8()コードポイントを呼び出すとき、U + D800からU + DFFFは0x3F( '?')に置き換えられます。それは情報が失われる場所です。 –

+0

これらは「エスケープ文字」ではありません。サロゲートの後ろの値と組み合わせた値は、コードポイントをエンコードします。結合していないサロゲートのシーケンスがあると、エンコードが破損し、Qtが何かを行うことが許可されます。迷子代理人を「?」で置き換えることを含む。 – peppe

0

私はQStringstd::stringを変換するタスクを持っていた、とQByteArrayQString

あなたは実行することによってそれを確認することができます。以下は、この作業を完了するために私がしたことです。

std::string str = "hello world"; 

QString qstring = QString::fromStdString(str); 

QByteArray buffer; 

あなたが "QByteArray::append" のドキュメントを検索する場合、それはQStringを取り、QByteArrayを返します。

buffer = buffer.append(str);