亂碼原因:
QT使用的是utf-8
簡體中文版的windows操作系統及其應用軟件默認都是ANSI/GBK編碼。而且這里應該是寬字符串。
多字節ANISGB
寬字符UNICODE
多字節顯示標准字符的時候,十六進制編碼對應的ASCILL編碼就是標准字符。
寬字符如UNICODE顯示標准字符的時候,會在前面(高位)補零。
多字節顯示漢字的時候,會看前面一個字節的值,如果這個值大於0x7F那么就會把后面的若干個字節看做是一個字符,比如GB是把本字節和后面的一個字節拿來看做一個字符來顯示。UTF-8會把后面的不定個字節拿來當一個字符顯示。
寬字符顯示漢字時,直接把兩個字節的信息看做一個字符拿來顯示。
多字節的結束符就是0x00
寬字節的結束符必須是兩個連續的0x00才會結束。
解決辦法:
//字符串長度
int len;
QStringList str_list;
//excel的第一列內容
for(int i = 0; i < 14; i ++)
{
str_list << pPages[i].str;
}
str_list << "Root密碼暗文";
QTextCodec *codec =QTextCodec::codecForName("UTF-8");
//QTextCodec *codec =QTextCodec::codecForLocale();
//sheet->Cell(0,1)->SetInteger(0);
for(size_t i = 0; i < 15; i++)
{
QString str = codec->toUnicode(str_list.at(i).toStdString().c_str());
wchar_t wstr[20];
len = str.toWCharArray(wstr);
//添加字符串結束符
wstr[len] = 0;
sheet->Cell(i,1)->SetInteger(1);
sheet->Cell(i,0)->SetWString(wstr);
}
總結:(自己的理解,不知道是否有錯)
關鍵代碼是:
QTextCodec *codec =QTextCodec::codecForName("UTF-8"); //1
QString str = codec->toUnicode(str_list.at(i).toStdString().c_str());//2
len = str.toWCharArray(wstr);//3
sheet->Cell(i,0)->SetWString(wstr);//4
這樣就解決了,注意,第二句是從utf-8(qt本身編碼方式)轉化為unicode,因為utf-8是變長字節數表示字符的,unicode是2字節表示;第三句的作用不是unicode轉化為寬字符串,字節數據本身沒有產生變化,只是把字節數據組織成一個寬字符數組,然后返回寬字符串的長度,最后把這個寬字符串傳遞給basic excel庫的SetWString函數,也就是sheet->Cell(i,0)->SetWString(wstr);這樣,因為excel用2個字節來表示一個字符,而不是一個字節表示一個字符,否則會亂碼。
http://blog.csdn.net/u013281495/article/details/51049646