概述
這些點(diǎn)都是建立在qt5.0之后的豪嗽,而且以默認(rèn)中文操作系統(tǒng)為準(zhǔn)
關(guān)于文字編碼
這里說(shuō)的文字編碼主要指的漫试,當(dāng)你要顯示一段文字時(shí)祈匙,否則沒(méi)必要管編碼魏保。
比如在qt里書(shū)寫(xiě)如下代碼:
const char *cp = "中國(guó)";
那么這個(gè)cp里面是什么內(nèi)容呢,如果調(diào)用ui->label->setText(cp),又是否能正確顯示呢漂坏?
我們只說(shuō)結(jié)論景埃,細(xì)節(jié)參考 其它文章,網(wǎng)上不少
cp里面是什么內(nèi)容呢?
首先cp是一段buffer顶别,運(yùn)行時(shí)里面是什么內(nèi)容要根據(jù)運(yùn)行時(shí)的編碼來(lái)決定,關(guān)于各種編碼定義是個(gè)新課題谷徙,不適合筆記。
當(dāng)運(yùn)行時(shí)編碼是utf-8時(shí)驯绎,cp是6個(gè)字節(jié)的buffer(不含\0)
當(dāng)運(yùn)行時(shí)編碼是GBK時(shí)完慧,cp是4個(gè)字節(jié)的buffer(不含\0)cp又是否能正確顯示呢?
在Qt中条篷,唯一能讓人迷惑的就是類(lèi)似這樣的代碼亂碼 (windows下 使用msvc kit)
setText(tr(“中國(guó)”))
此處出亂碼是有個(gè)隱形的東西骗随,msvc kit在中文系統(tǒng)會(huì)默認(rèn)指定前文提到的運(yùn)行時(shí)編碼為GBK蛤织, 這就導(dǎo)致cp也就是tr括弧內(nèi)的"中國(guó)“為 4字節(jié)的gbk編碼,而不是tr預(yù)期的6字節(jié)utf-8編碼赴叹,然后tr按照utf8去解釋這個(gè)gbk的buffer,那自然是亂碼指蚜。
如何克服呢乞巧, 在.pro加個(gè)編譯選項(xiàng)即可
QMAKE_CXXFLAGS += -execution-charset:utf-8
rebuild 后發(fā)現(xiàn)亂碼解決了
這里要提一個(gè)點(diǎn) qt5.0后 tr宏不在可以指定codec了,也就是說(shuō)它會(huì)固定認(rèn)為 tr擴(kuò)起來(lái)的buffer是utf8編碼摊鸡,如果不是绽媒,又沒(méi)翻譯文件的話(huà),會(huì)出亂碼免猾,上文中國(guó)出亂碼就是因?yàn)闆](méi)改之前tr里面不是utf8的編碼
你查看tr源碼就會(huì)發(fā)現(xiàn)是辕,它先去翻譯文件找這個(gè)字符串,如果找不到猎提,直接調(diào)用QSring::fromUtf8(cp), 那說(shuō)道這获三,其實(shí)都真像(●—●)了。