徹底解決QT編碼問題

2021-08-08 11:52:40 字數 2897 閱讀 8704

字串常量、"中文"是傳統的char型別的窄字串、在使用的時候只需要告訴qstring這兩個漢字採用的編碼構造qstring。

const

char * str = "中文";

qstring qstr = str; //相當於呼叫qstring::qstring(const char * str)初始化乙個qstring

概念1:原始檔是有編碼的

"中文" 在不同的編碼下對應不同的二進位制形式

可能在gbk編碼下是:ce d2 ca c7

在latin-1編碼下是:ba ba d7 d6

概念2:qstring內部採用的是unicode

乙個問題,源**中假如有4個位元組"\xce\xd2\xca\xc7「該怎麼轉換成unicode並儲存在qstring內。按照gbk、big5、latin-1還是其他方式...

在你不告訴它的情況下,它預設選擇了latin-1,於是4個字元"îòêç"的unicode碼被存進了qstring中。最終,4個latin字元出現在你期盼看到2中文字元的地方,所謂的亂碼出現了

問題很簡單,當你需要從窄字串 char* 轉成unicode的qstring字串的,你需要告訴qstring你的這串char* 中究竟是什麼編碼?gbk、big5、latin-1

理想情況就是:將char* 傳給qstring時,同時告訴qstring自己的編碼是什麼

就像下面的函式一樣,qstring的成員函式知道按照何種編碼來處理 c 字串

qstring qstring::fromascii ( const

char * str, int size = -1 )

qstring qstring::fromlatin1 ( const

char * str, int size = -1 )

qstring qstring::fromlocal8bit ( const

char * str, int size = -1 )

qstring qstring::fromutf8 ( const

char * str, int size = -1 )

qstring 只提供了這幾個成員函式,遠遠滿足不了大家的需求,比如,在簡體中文windows下,local8bit是gbk,可是有乙個char串是 big5 或 latin-2怎麼辦?

可以使用強大的qtextcodec,首先qtextcodec肯定知道自己所負責的編碼的,當你把乙個char串送給它,就能正確將其轉成unicode

qstring qtextcodec::tounicode ( const

char * chars ) const

可是這個呼叫太麻煩了

想直接qstring a= str;

qstring a

(str)

;這樣一來肯定沒辦法同時告訴 qstring 你的str是何種編碼了,只能通過其他方式了。

qtextcodec::setcodecforcstrings(qtextcodec::codecforname("gbk"));

qtextcodec::setcodecforcstrings(qtextcodec::codecforname("utf-8"));

設定qstring預設採用的編碼。而究竟採用哪乙個,一般來說就是源**是gbk,就用gbk,源**是utf-8就用utf-8。但有乙個例外,如果你儲存成了帶bom的utf-8而且用的微軟的cl編譯器,此時仍是gbk。

qstring內部採用的是 unicode,它可以同時存放gbk中的字元"我是漢字",big5中的字元"扂岆犖趼" 以及latin-1中的字元"îòê纺×ö"。

當你需要從窄字串 char* 轉成unicode的qstring字串的,你需要告訴qstring你的這串char* 中究竟是什麼編碼?gbk、big5、latin-1?

在你不告訴它的情況下,它預設選擇了latin-1,於是8個字元"îòê纺×ö"的unicode碼被存進了qstring中。最終,8個latin字元出現在你期盼看到4中文字元的地方,

所謂的亂碼出現了。

網上有很多方法介紹直接在main.cpp裡設定:

qtextcodec *codec = qtextcodec::codecforname("utf-8");

qtextcodec::setcodecfortr(codec);

qtextcodec::setcodecforlocale(codec);

qtextcodec::setcodecforcstrings(codec);

其實這在某些情況下也是有問題的,因為程式可能讀到系統的中文路徑,或者呼叫中文路徑下的外部程式,這時候如果系統是gb2312就有問題了。

因為中文路徑的編碼是採用utf-8存到qstring裡的,系統讀中文路徑解碼的時候採用的卻是系統的gb2312,所以會調不起帶中文路徑的外部程式。

以上問題下面方法可以解決:

qtextcodec *codec = qtextcodec::codecforname("utf-8");

qtextcodec::setcodecfortr(codec);

qtextcodec::setcodecforlocale(qtextcodec::codecforlocale()); //設定gbk到本地

qtextcodec::setcodecforcstrings(qtextcodec::codecforlocale());

對於外部字串編碼解碼全部採用本地編碼。

在qt5中,加上這句,原始檔使用utf-8編碼,不帶bom

(argc, argv)

;qtextcodec::setcodecforlocale(qtextcodec::codecforname("utf-8"));

徹底解決Spring MVC XSS注入問題

一 背景 最近所從事的專案,線上被掃瞄出部分連線存在xss注入問題。例如 上面連線中的 alert 1 指令碼被執行。存在xss漏洞。接下來開始解決,經過乙個曲折的過程終於找到乙個最佳方法。二 可能的方案 1 在每個controller入口的業務 處手動進行過濾,如 public xsscheck ...

Ajax中文問題徹底解決

中文問題是和做web的程式設計師形影不離的,jsp頁面的中文問題,url傳參的中文問題,request取值的中文問題 現在ajax日趨成熟了,它的中文問題也一樣浮出水面了。其實萬變不離其宗,中文問題就是編碼問題,我們知道所有的字符集,不管是英文,操作符,標點符號,最基本的編碼方式就是iso 8859...

徹底解決程式亂碼問題

由於程式程式設計過程中存在眾多的編碼集,而這些編碼集又各自有自己的方法來表示乙個中文字元。由此,造成我們的程式顯示中文的時候亂碼。最多的是本來是中文,但結果顯示為問號?這篇文章從我碰到過的問題來從根本上解決亂碼的問題,反正我用這個方法是百戰百勝 嘎嘎 我們知道,在我們的中文系統中使用的是 gbk 編...