[1] 簡單地使用 QTextCodec 和 tr 配合
在默認情況下,我們直接在源碼中使用中文,比如 setWindowTitle(tr(" 中文化研習 ")); ,則會在運行界面發現中文亂碼。遇到這種問題,如果無需考慮國際化,則可以直接使用 QTextCodec 設置編碼方式:
該語句需要包含頭文件 #include <QTextCodec> 。
選擇 GB18030 而不是 GBK 或者 GB2312 是因為前者的漢字收錄更豐富,並向下兼容了後兩者。但是在嵌入式設備上,如手機或 MP3 ,並不一定支持 GB18030 。
而既然是 setCodecForTr ,那麼就應該在第一次對 tr() 的調用之前設置編碼方式,一般應該在 main() 函數中緊接 Qapplication 對象創建後設置。 tr() 用來返回一個翻譯過的文本版本,在編寫代碼的過程中,對每一個用戶可見的文本都應該加上該函數。
這樣設置了以後,基本的中文顯示,如按鈕文本、窗口標題以及文本編輯區域,都可以得到良好的顯示。
值得一提的是,如果出現的不是亂碼,而是問號,則可能是字符編碼內無該字的編碼。另外一種問題是,如果出現的是方框(正方形),而不是亂碼,則可能是無該指定字體,可以通過設置 QFont 嘗試解決該問題。
[2] 關於使用 QString 來顯示中文
一是使用 toLocal8Bit 和 fromLocal8Bit 。比如下述代碼就可以良好地顯示中文:
通過這種方式可以使用系統的本地 8 位編碼格式。
二是通過 QString 和 QTextCodec 結合,設置在 const char * 和 Qstring 之間轉換時使用的編碼格式,比如下述代碼也可以使得漢字良好顯示:
[3] 使用 Qt 翻譯家
Qt 提供了外部的翻譯文件,只要對需要進行翻譯的文本使用 tr() 函數,然後在 .pro 工程文件中添加 TRANSLATIONS = localizer.ts ,這裡的文件名自然要根據具體需要設置。之後使用 lupdate 命令,如 lupdate localizer.pro ,生成 localizer.ts 。接著用 linguist 打開 localizer.ts ,並在文件裡面進行相應文本的翻譯,保存後發布,生成 localizer.qm 。
至此,在包含了頭文件 #include <QTranslator> 後,即可以安裝翻譯家,將相應的文本進行翻譯:
此時再運行程序,則可以發現界面上的文本已經得到翻譯了。
補充:在上述代碼中, localizer.qm 是由 qrc 文件指定位置的,本例中 localizer.qm 相對於 qrc 文件的位置是“ /localizer.qm ”,所以添加的時候使用“ :/localizer ”。而如果 qm 文件相對於 qrc 文件的位置是“ /translator/localizer.qm ”,則需要指定為“ :/translator/localizer.qm ”。
[4] 文件讀寫中的中文
這裡以讀取 Google 的天氣 API 為例。
Google 的中文天氣 API 為 http://www.google.com/ig/api?hl=zh_cn&weather= ,等號後面加城市名,比如“ beijing ”或者“ hongkong ”。
該 API 是以 XML 格式給出信息,而如果我們不加以修飾地直接讀取該 XML 文件的話,則會出現如“ é£ åï ¼ ä ¸åã é£ é ”之類的亂碼。
針對這種情況,可以先使用(不一定必須使用) QString 存放信息,因為可以用 QTextCodec 對 QString 進行編碼格式的設置:
這樣的話就可以以相應的編碼格式進行文件讀取。運行後,可以看到中文顯示正常。
同樣地,使用其它方式進行文件讀取的話也可以使用類似設置編碼格式的方法。比如,使用 QTextStream 時,如果希望使用特定的編碼進行讀寫,則可以使用該類的成員函數 setCodec() 。