日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

QT中文乱码总结

發布時間:2023/12/9 c/c++ 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QT中文乱码总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在寫一個非常簡單的QT源程序時遇到了中文亂碼問題,所以上網搜索得到了還算比較滿意的答案。

From: http://www.ctogo.net/313.html

WOWCode的主體部分基本已經完成了,對于我自己來說,其實已經足以應付我的需要了,不過如果發布的話,實在還是拿不出手,因為很多地方還需要完善,一些對我自己來說多余的功能也沒有完成,今天嘗試將程序移植到了另一臺機子上,卻出現了中文亂碼問題,記錄之。

也許你在用這個方法實現中文化,但它確實不夠嚴謹

Laguage? C++ Title? 出現頻率最高的辦法
  • #include?<QTextCodec>??
  • int?main(int?argc,?char?*argv[])?
  • {??
  • ???????????QApplication?app(argc,?argv);??
  • ???????????//設置中文開始
  • ???????????QTextCodec::setCodecForTr(QTextCodec::codecForName(“gb18030″));?
  • ???????????//設置中文結束
  • ???????????return?app.exec();??
  • }??

  • 很多地方都會告訴你,這樣可以實現QT支持中文,包括我看的教程書上也是,他甚至告訴我要支持中文必須加入這段代碼,但我想告訴你,這個辦法是有問題的,而且這個問題還不小!我在兩臺同樣是XP系統的機子上移植就出現了中文亂碼問題,而且所有中文都是用了tr()的。所以請別迷信那些教程,實踐才是真理!

    你可以嘗試這個方法

    Laguage? C++ Title?
  • #include?<QTextCodec>??
  • int?main(int?argc,?char?*argv[])?
  • {??
  • ???????????QApplication?app(argc,?argv);??
  • ???????????//設置中文開始
  • ???????????QTextCodec?*codec?=?QTextCodec::codecForName(“GB2312″);??
  • ???????????QTextCodec::setCodecForLocale(codec);??
  • ???????????QTextCodec::setCodecForCStrings(codec);??
  • ???????????QTextCodec::setCodecForTr(codec);??
  • ???????????//設置中文結束
  • ???????????return?app.exec();??
  • }??
  • 雖然這個方法看似更為嚴謹,你可以嘗試,不過這么寫還是會有問題,至少沒有解決我的問題。這也是我網上看到的出現頻率也挺高的方法,不過我想說的是:其實這個辦法治標不治本,因為它后面只是對拓寬對中文支持的范圍,而一般我們都建議把中文寫在tr(“”)里。

    推薦個比較保險的辦法

    Laguage? C++ Title? 我推薦的方法
  • int?main(int?argc,?char?*argv[])?
  • {
  • ????QApplication?a(argc,?argv);
  • ????QTextCodec?*codec?=?QTextCodec::codecForName(“System”);????//獲取系統編碼
  • ????QTextCodec::setCodecForLocale(codec);
  • ????QTextCodec::setCodecForCStrings(codec);
  • ????QTextCodec::setCodecForTr(codec);
  • ????return?a.exec();
  • }
  • 這里獲取了系統字體編碼,解決了我的問題,個人也覺得這個辦法應該是個不錯的解決方案。

    也可能是字體選擇不當造成的亂碼

    如果你始終解決不了亂碼問題,可以嘗試設置下字體,但其實是否是字體造成的亂碼的方法很簡單,如果出現的是一個個方塊,便是字體設置不當,否則,優先考慮編碼設置。

    =============================================

    下面看看我自己的總結吧,首先是源程序(目錄:a, 源代碼:a.cpp)

    // a.cpp #include <QApplication> #include <QLabel> #include <QTextCodec>int main(int argc, char *argv[]) {QApplication app(argc, argv);QTextCodec *codec = QTextCodec::codecForName("GBK");QTextCodec::setCodecForLocale(codec);QTextCodec::setCodecForCStrings(codec);QTextCodec::setCodecForTr(codec);QLabel label("Come on,你好嗎?");label.show();return app.exec(); } 代碼中的關鍵是: QTextCodec::codecForName("GBK");

    1. 通過這種方式來設置編碼格式,要保證源程序文件的編碼格式就是GBK(即ANSI格式(Linux上顯示為ISO-8859格式)),如果你把源程序文件編碼方式改為UTF8,那么編譯后就會出現亂碼了。

    2. 如果你的源程序文件編碼是UTF8,那就要將上面的GBK改為UTF8。這樣才能保證不出現亂碼。

    在保證了上面兩個條件后,將a.cpp拿到windows上或linux上編譯后得到的程序都不會出現亂碼現象。


    example2,將上面的源程序改為:

    // a.cpp #include <QApplication> #include <QLabel> #include <QTextCodec>int main(int argc, char *argv[]) {QApplication app(argc, argv);QTextCodec *codec = QTextCodec::codecForName("System");QTextCodec::setCodecForLocale(codec);QTextCodec::setCodecForCStrings(codec);QTextCodec::setCodecForTr(codec);QLabel label("Come on,你好嗎?");label.show();return app.exec(); } 1.  QTextCodec::codecForName("System"); // 取系統的編碼,在windows上會得到中文編碼,在linux上默認是UTF8,與系統設置有關。

    2.? 對于這樣的代碼,在windows上要將源程序文件編碼改為ANSI格式,在linux上要改為UTF8格式,否則就會出現亂碼。不信可以試試。


    對于以上兩個例子,要說明的就是這些。

    最后,再來一個結論:我發現QT編譯后的可執行程序可以適應當前不同的編碼格式。即編譯好之后,不管你當前是以GBK或UTF8格式查看,都不會出現亂碼。這是QT程序與普通的C/C++程序的區別。




    總結

    以上是生活随笔為你收集整理的QT中文乱码总结的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。