關於Qt的字元編碼問題

2021-05-22 17:04:59 字數 2660 閱讀 8790

qt使用

unicode

來儲存,繪製以及操作字串。在很多情況下,可能想要使用不同的編碼方式來處理資料。例如大部分的日語檔案都被儲存在

shift-jis

或者iso2022

的檔案中,而俄羅斯的使用者常常使用

koi8-r

或者cp1251

編碼方式。

qt提供了乙個

qtextcodec

類集合來從

unicode

格式轉化到相應的格式。

通過qtextcodec

可以對程式預設編碼方式,有以下三種:

void setcodecforcstrings(qtextcodec *codec);

void setcodecforlocale(qtextcodec *c);

void setcodefortr(qtextcodec *c);

例如:qtextcodec gbk = qtextcodec::codecforname("gb18030");

qtextcodec::setcodefortr(gbk);

下面對這三種方法進行解析:

1.void setcodecforcstrings(qtextcodec *codec);

對程式構造字串的編碼方式,例如:

qstring str = 「

中文」;

那麼「中文」,是用

gb18030

編碼格式儲存。

2.void setcodecforlocale(qtextcodec *c);

對本地字元編碼設定,即系統的編碼格式。

qt中用於控制讀入和寫出檔案系統時的字元編碼由

qtextcodec::setcodecforlocale()

所決定,

3.void setcodefortr(qtextcodec *c);

跟第一種方式相識,

是程式在

qobject

::tr

()用到的地方,進行編碼顯示。

例如:qstring str = tr(「

中文」); 那麼

str可以進行顯示,而不會亂碼

這三種方法有相應的

get方法:

qtextcodec * codecforcstrings();

qtextcodec * codecforlocale();

qtextcodec *codecfortr();

注意:codecforcstrings()

和codecfortr()

方法,預設值為

0,即沒有提前設定編碼方式,會產生返回

null

,而codecforlocale()

,在預設情況下,返回

system

。qtextcodecs

可以使用如下一些本地編碼轉換為

unicode

字串。假設你已經在俄羅斯

koi8 - r

的編碼方式編碼的一些字串,並想將其轉換為

unicode

。最簡單的方法做到這一點是這樣:

qbytearray encodedstring = "...";

qtextcodec *codec = qtextcodec::codecforname("koi8-r");

qstring string = codec->tounicode(encodedstring);

在此之後,轉換為

unicode

字串儲存的文字。從

unicode

字串轉換為本地編碼是一樣簡單:

qstring string = "...";

qtextcodec *codec = qtextcodec::codecforname("koi8-r");

qbytearray encodedstring = codec->fromunicode(string);

通用的方式是在程式的開頭加上:

qtextcodec *gbk = qtextcodec::codecforname("gb18030");

qtextcodec::setcodecfortr(gbk);

qtextcodec::setcodecforcstrings(gbk);

qtextcodec::setcodecforlocale(gbk); 轉

utf-8

編碼:qstring str = "

中文" ;

qbytearray coded = str.toutf8();

qstring string = utf8->tounicode(coded);

qdebug() << "qobject::trutf8:" << qobject::trutf8(coded);

qdebug() << "string" << string; 由

utf-8

編碼轉gbk

編碼:qbytearray code = string.tolocal8bit();

qstring str1 = gbk->fromunicode(code);

qdebug() << "str1:" << str1;

關於字元編碼的問題

寫程式的人基本上都會遇到亂碼的問題,之前自己對字符集 編碼等問題也是一知半解,大概明白什麼意思,但卻說不清楚。由於公司需要做多語言,於是研究了一下,終於把字符集和編碼等問題弄明白了。ascii gb2312 gbk unicode utf 8 utf 16 ucs2 ucs4.對於很多人來說這些東西...

關於字元編碼的問題

這幾天一直在改 前輩 流下來的乙個程式,其中讓我很無語的是 他的字元編碼居然全在servlet 中進行轉碼的,就是這樣 string submit new string request.getparameter submit1 getbytes iso 8859 1 gbk 居然寫成這樣了 讓我來擴...

關於字元編碼的問題

在乙個activity裡面有乙個文字輸入框,我在後台通過 edittext et username edittext findviewbyid r.id.username string username new string et username.gettext tostring 這樣拿到的字串不...