如只是提供給本機使用者使用,無需國際化
先調用下面兩個函數之一
QTextCodec *textc=QTextCodec::codecForName(”gbk”);
QTextCodec *textc=QTextCodec::codecForName(”utf8″);
然後調用下面3個函數之一
QTextCodec::setCodecForCStrings(textc);
QTextCodec::setCodecForTr(textc);
QTextCodec::setCodecForLocale(textc);
至於調用哪一個是不知道的,只好挨著試,反正組合也不多。問題是解決了。但下次還是這麼試。
下面我們來看看這幾個函數都作用在什麼地方。
1. setCodecForCStrings(textc)
這個函數主要用在用字元常量或者QByteArray構造QString對象時使用的預設編碼方式。比如下面一個例子
23 int main(int argc,char *argv[]){
24 QApplication app(argc,argv);
25
26 QTextCodec *tc=QTextCodec::codecForName(”utf8″);
27 QTextCodec::setCodecForCStrings(tc);
28 QString str(”寧願看見兩個惡魔在拔河,也不願看見一隻天使在跳舞。”);
29 QPushButton ww(str);
30 ww.show();
31
32 app.exec();
33 }
如果把26,27行的地方注釋掉,那麼我們在QPushButton上看到的將是一堆亂碼。因為在預設情況下QString把建構函式的字串參數當成標準拉丁字元,很顯然是會出現亂碼的。如果是在Linux下的話你在編輯器裡輸入的時候,預設文字格式設定是”utf8″,如果你是在windows下做開發那麼26行的地方很可能要改成”gbk”了。
2. setCodecForTr(textc)
這個函數的作用是設定傳給tr函數時的預設字串編碼
23 int main(int argc,char *argv[]){
24 QApplication app(argc,argv);
25
26 QTextCodec *tc=QTextCodec::codecForName(”utf8″);
27 QTextCodec::setCodecForCStrings(tc);
28 QString str(QObject::tr(”寧願看見兩個惡魔在拔河,也不願看見一隻天使在跳舞。”));
29 QPushButton ww(str);
30 ww.show();
31
32 app.exec();
33 }
同樣一個例子,我在28行的地方加了tr之後,啟動並執行結果又不能正常顯示中文了。需要將27行的函數改成setCodecForTr就可以了。
3. QTextCodec::setCodecForLocale(textc)
這個函數主要用於設定和對本地檔案系統讀寫時候的預設編碼格式。比如通過流讀取一個檔案時內容時的編碼格式。或者通過qDebug()輸出列印資訊時的編碼。
7 int main(int argc,char *argv[]){
8 QTextCodec *tc=QTextCodec::codecForName(”utf8″);
9 QTextCodec::setCodecForCStrings(tc);
10 QString str(”寧願看見兩個惡魔在拔河,也不願看見一隻天使在跳舞。”);
11
12 QTextCodec *tl=QTextCodec::codecForName(”utf8″);
13 QTextCodec::setCodecForLocale(tl);
14 qDebug()<<str;
15 }
你也可以試試把第12行去掉或者編碼改成”gbk”,就會大概明白setCodecForLocale的作用了。
--------------------------------------------------------------------------------------------------------------------
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB18030"));
從UTF8編碼到GB編碼的字串轉換方法:
QString Utf8_To_GB(QString strText)
{
return QString::fromUtf8(strText.toLocal8Bit().data());
}
至於從GB到UTF8,那大家就經常用了:
QString GB_To_Utf8(char *strText)
{
return QString::fromLocal8Bit(strText);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
在Qt4中,國內很多新手都喜歡——不分青紅皂白地使用如下3行代碼
QTextCodec::setCodecForTr(...)
QTextCodec::setCodecForCStrings(...)
QTextCodec::setCodecForLocale(...)儘管之前零零散散寫過一點這方面的內容,比如
QString 與中文問題
Qt中translate、tr關係 與中文問題
Qt國際化(源碼含中文時)的點滴分析
但是,敢死隊員還是一批一批的 ... 讓人少多有些無奈
癥結?
在國內,之所以用很多人用這3行代碼,是因為他們在原始碼的const char*這種窄字串中使用了中文。
然後,發現。不對啊,咋全是亂碼呢?於是上網搜尋,發現其他人用的這3行代碼
於是,加上試試。發現:在自己的當前環境下(固定系統、固定地區語言設定、固定編譯環境)還真的沒有亂碼了。
於是乎?完全不考慮那3行代碼的作用了,反正自己能用就行了,管它什麼副作用呢!!
Qt5
在Qt5中,這個問題終於不複存在了,因為
這兩個函數
QTextCodec::setCodecForTr(...)
QTextCodec::setCodecForCStrings(...)被直接去掉了。
這樣一來,受影響的直接是如下代碼了:
QString s1 = "我是中文";
QString s2("我是中文");
QString s3 = QObject::tr("我是中文")好訊息/壞訊息?
壞訊息:
現在Qt5中儘管去掉了setCodecXXX這兩個函數,但是預設編碼還是latin1。如果你要想使用
"我是中文"這樣的字串,必須自己使用QTextCodec或這QString::fromXXX 這種東西進行轉換
好訊息 是:
Qt5發布之時,預設將會是utf8編碼,完全可以將你從Qt編碼問題解放出來。
壞訊息,如果使用的是 MSVC2005/2008/2010,可能無法使用utf8編碼,於是
下面的代碼
QString s1 = "我是中文";
QString s2("我是中文");
QString s3 = QObject::tr("我是中文")將不會工作。
因為從MSVC2005起,你無法給編譯器設定字串要使用的編碼。儘管2003之前,也無法設定,但是它會遵循源碼檔案的編碼。而2005就自作聰明了,即使你源碼檔案儲存成不帶BOM的utf8,它都會試圖幫你轉換一下。
好訊息是什麼呢?
如果你在Windows下,且使用的是MinGW,那麼只要你將源碼檔案儲存成utf8,前面的代碼將直接可以工作(無須其他設定)
如果你在其他平台了,那麼應該都預設是utf8檔案。同樣無須進行設定。
好訊息
如果你的編譯器支援C++11,那麼,你可以直接使用
QString s = u8"我是中文";壞訊息
主流編譯器還都不怎麼支援C++11
作者 dbzhang800
如只是提供給本機使用者使用,無需國際化
先調用下面兩個函數之一
QTextCodec *textc=QTextCodec::codecForName(”gbk”);
QTextCodec *textc=QTextCodec::codecForName(”utf8″);
然後調用下面3個函數之一
QTextCodec::setCodecForCStrings(textc);
QTextCodec::setCodecForTr(textc);
QTextCodec::setCodecForLocale(textc);
至於調用哪一個是不知道的,只好挨著試,反正組合也不多。問題是解決了。但下次還是這麼試。
下面我們來看看這幾個函數都作用在什麼地方。
1. setCodecForCStrings(textc)
這個函數主要用在用字元常量或者QByteArray構造QString對象時使用的預設編碼方式。比如下面一個例子
23 int main(int argc,char *argv[]){
24 QApplication app(argc,argv);
25
26 QTextCodec *tc=QTextCodec::codecForName(”utf8″);
27 QTextCodec::setCodecForCStrings(tc);
28 QString str(”寧願看見兩個惡魔在拔河,也不願看見一隻天使在跳舞。”);
29 QPushButton ww(str);
30 ww.show();
31
32 app.exec();
33 }
如果把26,27行的地方注釋掉,那麼我們在QPushButton上看到的將是一堆亂碼。因為在預設情況下QString把建構函式的字串參數當成標準拉丁字元,很顯然是會出現亂碼的。如果是在Linux下的話你在編輯器裡輸入的時候,預設文字格式設定是”utf8″,如果你是在windows下做開發那麼26行的地方很可能要改成”gbk”了。
2. setCodecForTr(textc)
這個函數的作用是設定傳給tr函數時的預設字串編碼
23 int main(int argc,char *argv[]){
24 QApplication app(argc,argv);
25
26 QTextCodec *tc=QTextCodec::codecForName(”utf8″);
27 QTextCodec::setCodecForCStrings(tc);
28 QString str(QObject::tr(”寧願看見兩個惡魔在拔河,也不願看見一隻天使在跳舞。”));
29 QPushButton ww(str);
30 ww.show();
31
32 app.exec();
33 }
同樣一個例子,我在28行的地方加了tr之後,啟動並執行結果又不能正常顯示中文了。需要將27行的函數改成setCodecForTr就可以了。
3. QTextCodec::setCodecForLocale(textc)
這個函數主要用於設定和對本地檔案系統讀寫時候的預設編碼格式。比如通過流讀取一個檔案時內容時的編碼格式。或者通過qDebug()輸出列印資訊時的編碼。
7 int main(int argc,char *argv[]){
8 QTextCodec *tc=QTextCodec::codecForName(”utf8″);
9 QTextCodec::setCodecForCStrings(tc);
10 QString str(”寧願看見兩個惡魔在拔河,也不願看見一隻天使在跳舞。”);
11
12 QTextCodec *tl=QTextCodec::codecForName(”utf8″);
13 QTextCodec::setCodecForLocale(tl);
14 qDebug()<<str;
15 }
你也可以試試把第12行去掉或者編碼改成”gbk”,就會大概明白setCodecForLocale的作用了。
--------------------------------------------------------------------------------------------------------------------
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB18030"));
從UTF8編碼到GB編碼的字串轉換方法:
QString Utf8_To_GB(QString strText)
{
return QString::fromUtf8(strText.toLocal8Bit().data());
}
至於從GB到UTF8,那大家就經常用了:
QString GB_To_Utf8(char *strText)
{
return QString::fromLocal8Bit(strText);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
在Qt4中,國內很多新手都喜歡——不分青紅皂白地使用如下3行代碼
QTextCodec::setCodecForTr(...)
QTextCodec::setCodecForCStrings(...)
QTextCodec::setCodecForLocale(...)儘管之前零零散散寫過一點這方面的內容,比如
QString 與中文問題
Qt中translate、tr關係 與中文問題
Qt國際化(源碼含中文時)的點滴分析
但是,敢死隊員還是一批一批的 ... 讓人少多有些無奈
癥結?
在國內,之所以用很多人用這3行代碼,是因為他們在原始碼的const char*這種窄字串中使用了中文。
然後,發現。不對啊,咋全是亂碼呢?於是上網搜尋,發現其他人用的這3行代碼
於是,加上試試。發現:在自己的當前環境下(固定系統、固定地區語言設定、固定編譯環境)還真的沒有亂碼了。
於是乎?完全不考慮那3行代碼的作用了,反正自己能用就行了,管它什麼副作用呢!!
Qt5
在Qt5中,這個問題終於不複存在了,因為
這兩個函數
QTextCodec::setCodecForTr(...)
QTextCodec::setCodecForCStrings(...)被直接去掉了。
這樣一來,受影響的直接是如下代碼了:
QString s1 = "我是中文";
QString s2("我是中文");
QString s3 = QObject::tr("我是中文")好訊息/壞訊息?
壞訊息:
現在Qt5中儘管去掉了setCodecXXX這兩個函數,但是預設編碼還是latin1。如果你要想使用
"我是中文"這樣的字串,必須自己使用QTextCodec或這QString::fromXXX 這種東西進行轉換
好訊息 是:
Qt5發布之時,預設將會是utf8編碼,完全可以將你從Qt編碼問題解放出來。
壞訊息,如果使用的是 MSVC2005/2008/2010,可能無法使用utf8編碼,於是
下面的代碼
QString s1 = "我是中文";
QString s2("我是中文");
QString s3 = QObject::tr("我是中文")將不會工作。
因為從MSVC2005起,你無法給編譯器設定字串要使用的編碼。儘管2003之前,也無法設定,但是它會遵循源碼檔案的編碼。而2005就自作聰明了,即使你源碼檔案儲存成不帶BOM的utf8,它都會試圖幫你轉換一下。
好訊息是什麼呢?
如果你在Windows下,且使用的是MinGW,那麼只要你將源碼檔案儲存成utf8,前面的代碼將直接可以工作(無須其他設定)
如果你在其他平台了,那麼應該都預設是utf8檔案。同樣無須進行設定。
好訊息
如果你的編譯器支援C++11,那麼,你可以直接使用
QString s = u8"我是中文";壞訊息
主流編譯器還都不怎麼支援C++11
作者 dbzhang800