QString中文亂碼

QString::QString ( const char * str )
QString QTextCodec::toUnicode ( const Char * a , int size, ConverterState * state = 0 ) const
Converts a from the encoding of this codec to Unicode, and returns the result in a QString.
把字符串a從codecForCStrings所表示的編碼轉換到Unicode編碼.
前面寫的 str("中文"); 出現的亂碼, 很有可能是因為codecForCStrings所表示的編碼不對.在QTextCodeC中有這樣一個函數:
void | setCodecForCStrings ( QTextCodec * codec ) |
這是一個靜態函數看它的實現代碼, 在文件qtextcodec.h中:
inline void QTextCodec::setCodecForCStrings(QTextCodec *c) { QString::codecForCStrings = c; }
只有一句話, 就是設置codecForCStrings的值, 這就是用於把 char * 轉換成Unicode的對象.
我們來試試重新設置一下 codecForCStrings 對象,修改一下它所表示的編碼, 下面是修改后的代碼:
#include <QCoreApplication>
#include <QString>
#include <QDebug>
#include <QTextCodec>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK")); // 關鍵是這句
QString str("亂碼");
qDebug() << str;
return a.exec();
}
編譯運行看結果:

正如期待的一樣, 可以正確的顯示中文.
那么為什么加上那句就可以正確顯示中文了呢?
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK")); // 關鍵是這句
加這句是認為字符串 "亂碼" 是GBK編碼的.結果非常的 "巧合" 它正好是GBK編碼的.所以結果就正確了.
為什么設為GBK編碼就可以了呢??
因為我用的是 Visual Studio 2008 編譯的, vs2008 編譯器編譯時會把 字符串 用locale字符編碼字符串
我的系統編碼是GBK, 所以就正確了.
至於其它的編譯器, 請參考鏈接中的文章...大牛寫的.
vs2008, vs2005.編譯時不管源碼是什么編碼都會把源碼中的字符串轉換成 locale 編碼(中文系統就是GBK),
有兩種方法處理中文:
1. QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK")); // 關鍵是這句
2.QString str = QString::fromLocal8bit("中文");
vs2003, 1. 如果源碼是 ANSI(中文系統中的GBK編碼) 編碼的, 則在程序中可以這樣處理中文:
QString str = QString::fromLocal8bit("中文");
2. 如果源碼是 UTF-8 編碼的則在程序中可以這樣處理中文:
QString str = QString::fromUtf8("中文");
gcc 和 vs2003一樣的處理, 不過gcc有編譯選項可以設置, 請參數后面的鏈接.
http://blog.csdn.net/dbzhang800/article/details/7540905
我發現在數組里必須要這樣寫:
FROM: http://tgstdj.blog.163.com/blog/static/748200402013213105251450/