這可能聽起來像是一個明顯的問題,但我錯過了UTF-8的編碼方式或toUtf8函數的工作原理。什麼是QString :: toUtf8在做什麼?
讓我們來看看一個非常簡單的程序
QString str("Müller");
qDebug() << str << str.toUtf8().toHex();
然後我得到的輸出
"Müller" "4dc383c2bc6c6c6572"
但我上心的的letter ü應該被編碼爲c3bc而不是c383c2bc。
感謝 約翰
這可能聽起來像是一個明顯的問題,但我錯過了UTF-8的編碼方式或toUtf8函數的工作原理。什麼是QString :: toUtf8在做什麼?
讓我們來看看一個非常簡單的程序
QString str("Müller");
qDebug() << str << str.toUtf8().toHex();
然後我得到的輸出
"Müller" "4dc383c2bc6c6c6572"
但我上心的的letter ü應該被編碼爲c3bc而不是c383c2bc。
感謝 約翰
這取決於您的源代碼的編碼。
我傾向於認爲你的文件已經以UTF-8編碼,字符ü被編碼爲C3 BC。
你調用QString::QString (const char * str)
構造函數,根據http://doc.qt.io/qt-4.8/qstring.html#QString-8,轉換您的字符串中使用的默認情況下考慮輸入爲Latin1的內容的QString :: fromAscii()方法爲Unicode。由於C3和BC在拉丁文1中都是有效的,分別代表&Atilde;和&frac14 ;,將它們轉換爲UTF-8將導致以下字符:
&Atilde; (C3)→C3 83
&frac14; (BC) - > C2 BC
導致你得到的字符串: 「4D C3 83 C2 BC 6C 6C 65 72」
總結的事情了,它的雙UTF-8編碼。
有幾種選擇來解決這個問題:
1)你可以用你喜歡的文本編輯器源文件轉換爲Latin-1的。
2)您可以正確地將ü字符轉義爲\ xFC在字符串中,所以字符串將不依賴於文件的編碼。
3)你可以保持文件和字符串爲UTF-8的數據,並使用QString str = QString::fromUtf8 ("Müller");
更新:這個問題是不再相關的QT5。 http://doc.qt.io/qt-5/qstring.html#QString-8指出構造函數現在在內部使用QString::fromUtf8()
而不是QString::fromAscii()
。所以,只要UTF-8編碼一直使用,它將被默認使用。
運行你的代碼,我得到預期的結果
"4dc3bc6c6c6572"
我認爲這個問題是你不輸入輸出。 檢查源文件的編碼並查看 void QTextCodec::setCodecForCStrings (QTextCodec * codec) [static]
http://stackoverflow.com/questions/29485602/qt-convert-unicode-entites – trante 2015-04-07 10:14:32