2012-06-22 76 views
1

我開發使用Qt我公司的協議。需要查詢Window Registry並將獲得的值寫入預先協商的套接字。我已將註冊表數據讀入QString。我必須使用8位Unicode字符和一些16位Unicode字符。在使用QTcpSocket::write()寫入套接字之前,我正在使用QByteArray來存儲所有數據。必須遵守小尾巴。寫的Unicode UTF-8和UTF-16數據轉換爲QByteArray中

  1. 我如何從QString在Unicode的8位格式的數據爲QByteArray(規格說性格類型對應quint8)?

  2. 我如何從QString數據爲QByteArray以Unicode 16位格式(規範說性格類型對應quint16)?

  3. 我如何保持小字節順序在所有情況下?

(我沒有使用Unicode /可變字節編碼數據處理的經驗)

+0

沒有8位或16位的Unicode字符。 Unicode是一個21位的代碼。你可能參考了UTF-8和UTF-16(它們使用8位或16位代碼*單元來表示Unicode代碼點)? – Joey

+0

@Joey也許這就是這個規範的含義(你寫的),但這就是它說的方式(我寫的)。你說什麼是要求的,我會怎麼做呢? – ustulation

+0

@ustulation兩種方式都比沒有回答問題要好。 –

回答

4

展望的文件中是一個好的開始。

  1. QString::toUtf8()
  2. 創建一個新的QByteArray開始用BOM。使用QString::utf16()來獲取ushort值,將你想要的字節序列的上半部分和下半部分掩蓋到QByteArray中。
  3. UTF-8沒有/需要字節順序。把16位值成一個8位的陣列,用於小端序所需的USHORT掩模將0x00FF然後0xFF00
  4. 閱讀The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)今晚在家。
+0

自己不能說得更好。一個*優秀的*答案! [打印出'絕對最低...'本人] –

1

對於你的問題#2 - 如何的QString轉換爲UTF-16的QByteArray,沒有與QTextCodec來:: fromUnicode()的解決方案,如下面的代碼示例:

#include <QCoreApplication> 
#include <QTextCodec> 
#include <QDebug> 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 

    // QString to QByteArray 
    // ===================== 

    QString qstr_test = "test"; // from QString 
    qDebug().noquote().nospace() << "qstr_test[" << qstr_test << "]";  // Should see: qstr_test[test] 

    QTextCodec * pTextCodec = QTextCodec::codecForName("UTF-16"); 

    QByteArray qba_test = pTextCodec->fromUnicode(qstr_test); // to UTF-16 QByteArray 
    qDebug() << "qba_test["; 
    int test_size = qba_test.size(); 
    for(int i = 0; i < test_size; ++i) { // Should see each UTF-16 encoded character per line like this: ÿþt e s t 
     qDebug() << qba_test.at(i); 
    } 
    qDebug() << "]"; 

    return a.exec(); 
} 

的上面的代碼已經使用Qt 5.4進行了測試。