2012年8月22日 星期三

[筆記] QT字符集

一般說來,字符分為ASCII集,MultiByte集和WideChar集。


(1)ASCII:用一個字節表示少量的英文字符。


(2)MultiByte:一般指使用一個字節或者兩個字節來表示一個字符的方式,當第一位為0時,用第一個字節表示半角字符,否則是雙字節的全角字符。 GBK,GB2312,BIG5,GB18030等都是是雙字節字符集(DBCS);可以使用string類型表示。


(3)WideChar:常用於Unicode,使用兩個字節表示一個字符,通常使用wchar_t,wstring來存儲。



當使用QT向數據庫中插入中文字符時,產生很多亂碼,但是並不報錯。幸好發現QT中一個QTextCodec類型,在<qtextcodec.h>中定義。 qt對默認的是unicode編碼,但是在Linux下TextCodec通常是GBK的,而Windows下通常是GB18030的。


所以在Linux中,可以定義:
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));


或在Windows中:
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB18030"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB18030"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("GB18030"));


一種通用的寫法是:
QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());
QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());


在使用時:
使用QString::fromLocal8Bit()轉換成QString;
使用QString::ToStdString()得到正確的string類型。


沒有留言:

張貼留言