字串常量、"中文"是傳統的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 編...