qt寬字符串中文亂碼(codec->toUnicode值得學習)


亂碼原因:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM