setCodecForCString setCodecForTr setCodecForLocale

來源:互聯網
上載者:User

如只是提供給本機使用者使用,無需國際化

先調用下面兩個函數之一

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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.