2011-01-31 172 views
12

這可能聽起來像是一個明顯的問題,但我錯過了UTF-8的編碼方式或toUtf8函數的工作原理。什麼是QString :: toUtf8在做什麼?

讓我們來看看一個非常簡單的程序

QString str("Müller"); 
qDebug() << str << str.toUtf8().toHex(); 

然後我得到的輸出

"Müller" "4dc383c2bc6c6c6572" 

但我上心的的letter ü應該被編碼爲c3bc而不是c383c2bc

感謝 約翰

+0

http://stackoverflow.com/questions/29485602/qt-convert-unicode-entites – trante 2015-04-07 10:14:32

回答

17

這取決於您的源代碼的編碼。

我傾向於認爲你的文件已經以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編碼一直使用,它將被默認使用。