zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    F
    D
    J
    M
    H
    L
    Android线程之间的通讯
    Java4Android基础学习之异常
    Java4Android基础学习之接口
    Java4Android基础学习之包与访问权限
  • 原文地址:https://www.cnblogs.com/findumars/p/5365993.html
Copyright © 2011-2022 走看看