Ads 468x60px

##EasyReadMore##

19 8月, 2015

如何正常顯示 QT 中文編碼

解決方法如下
先調用下面兩個函數之一
    QTextCodec *textc=QTextCodec::codecForName(”gbk”);
    QTextCodec *textc=QTextCodec::codecForName(”utf8″);
然後調用下面3個函數之一
    QTextCodec::setCodecForCStrings(textc);
    QTextCodec::setCodecForTr(textc);
    QTextCodec::setCodecForLocale(textc);
至於調用哪一個是不知道的,只好挨著試,反正組合也不多。問題是解決了。但下次還是這麼試。
下面我們來看看這幾個函數都作用在什麼地方。

1. setCodecForCStrings(textc)


這個函數主要用在用字符常量或者QByteArray構造QString對象時使用的默認編碼方式。比如下面一個例子
23 int main(int argc,char *argv[]){
24 QApplication app(argc,argv);
25
26 QTextCodec *tc=QTextCodec::codecForName("utf8");
27 QTextCodec::setCodecForCStrings(tc);
28 QString str(”寧願看見兩個惡魔在拔河,也不願看見一隻天使在跳舞。”);
29 QPushButton ww(str);
30 ww.show();
31
32 app.exec();
33 }

如果把26,27行的地方註釋掉,那麼我們在QPushButton上看到的將是一堆亂碼。因為在默認情況下QString把構造函數的字符串參數當成標準拉丁字符,很顯然是會出現亂碼的。如果是在Linux下的話你在編輯器裡輸入的時候,默認文本格式是”utf8″,如果你是在windows下做開發那麼26行的地方很可能要改成”gbk”了。

2. setCodecForTr(textc)


這個函數的作用是設置傳給tr函數時的默認字串編碼
23 int main(int argc,char *argv[]){
24 QApplication app(argc,argv);
25
26 QTextCodec *tc=QTextCodec::codecForName("utf8");
27 QTextCodec::setCodecForCStrings(tc);
28 QString str(QObject::tr(”寧願看見兩個惡魔在拔河,也不願看見一隻天使在跳舞。”));
29 QPushButton ww(str);
30 ww.show();
31
32 app.exec();
33 }

同樣一個例子,我在28行的地方加了tr之後,運行的結果又不能正常顯示中文了。需要將27行的函數改成setCodecForTr就可以了。

3. QTextCodec::setCodecForLocale(textc)


這個函數主要用於設置和對本地文件系統讀寫時候的默認編碼格式。比如通過流讀取一個文件時內容時的編碼格式。或者通過qDebug()輸出打印信息時的編碼。
7 int main(int argc,char *argv[]){
8 QTextCodec *tc=QTextCodec::codecForName("utf8");
9 QTextCodec::setCodecForCStrings(tc);
10 QString str(”寧願看見兩個惡魔在拔河,也不願看見一隻天使在跳舞。”);
11
12 QTextCodec *tl=QTextCodec::codecForName("utf8");
13 QTextCodec::setCodecForLocale(tl);
14 qDebug()


參考文件


谈谈Qt的中文编码~ - 技术文档 - 桌面应用 Linux时代 - 开源、自由、共享 - 中国最大的Linux技术社区 - http://goo.gl/ljAU0q

0 意見:

張貼留言

 
Blogger Templates