2016-07-23 86 views
2

我有從QString的穿越 - 到QByteArray中的一個問題,然後返回到QString的:Qt的QString時,QByteArray中和背部

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; 
} 

正如你可以看到我填補在16位範圍內的所有字符,即QString。然後將它們轉換爲QByteArray(Utf8)並返回到QString。問題是值爲0的字符和值大於55295的字符無法轉換回QString。

如果我留在範圍1到< 55297這個測試通過。

+0

的0字符終止字符串,所以很明顯,它不會工作 – user4759923

+0

忘了「\ 0」,但我仍然不明白,與其他值的問題。 – JanSLO

+0

也許這些unicode字符沒有實現 – 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

我有一個任務轉換到std::stringQString,並QStringQByteArray。以下是我爲完成此任務所做的工作。

std::string str = "hello world"; 

QString qstring = QString::fromStdString(str); 

QByteArray buffer; 

如果您查找的 「QByteArray::append」 的文件,它需要QString並返回QByteArray

buffer = buffer.append(str);