Qt QString 中文 char* UTF-8 QByteArray QTextCodec unicode gb2312 GBK

 

#include <QFile>
#include <QFileDialog>
#include <QTextCodec>
#include <QByteArray>

void MainWindow::on_pushButton_clicked()
{   
    /*
      只有8位编码的才需要tr, unicode不要tr
      gb2312是GBK的子集,通常设成哪个都一样的
      所谓的QString转char*,结果并不相同,根据编码格式不同而不同
      QString转unicode,不用转,QString本身就是unicode
      QString的根本是QChar数组,但不是以0结尾,有大小,QChar的根本是ushot
      Qt中unicode声明:可以用wchar_t,也可以用ushot,没有WCHAR
      QByteArray可以理解为char类型的动态数组,有大小,不是以\0结尾
    */

    /*
        ui创建1个列表框QListWidget,和1个按钮即可

        用windows记事本分别创建4种文件,本例可直接打开
        ANSI:没有文件头,2字节/汉字,1字节/英文
        UTF-8:文件头[0xEF,0xBB,0xBF],3字节/汉字,1字节/英文
        Unicode:文件头[0xFF,0xFE],2字节/汉字,2字节/英文
        Unicode big endian :文件头[0xFE,0xFF],同Unicode,字节序相反

        QString转char*的规则同上;

    */

    /*
    QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
    QTextCodec::setCodecForTr(QTextCodec::codecForName("gb2312"));
    QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));

    如下使用想要得到正确结果必须使用类似以上的语句
    str = tr("显示中文");

    但以下这个可以直接使用
    strText = QString::fromLocal8Bit("显示中文");
    */

    ui->list->addItem(QString::fromLocal8Bit("--------显示中文----------"));

    QString strFileName = QFileDialog::getOpenFileName(this, tr("OpenFile"), ".", tr("Image Files(*.*)"));
    if(strFileName.length() == 0)
    {
        ui->list->addItem(tr("You didn't select any files."));
        return;
    }

    // 打开文件
    QFile *pFile = new QFile(strFileName);
    if (!pFile->open(QFile::ReadOnly))
    {
        ui->list->addItem(tr("open file fail %1: %2.").arg(strFileName).arg(pFile->errorString()));
        return;
    }
    ui->list->addItem(tr("open file ok %1").arg(strFileName));

    // 读文件
    qint64 fileSize = pFile->size();
    ui->list->addItem(tr("size = %1").arg(fileSize));
    char *pBuf = new char[fileSize];
    pFile->read(pBuf, fileSize);
    pFile->close();

    if(fileSize < 4)
    {
         ui->list->addItem(tr("fileSize < 4"));
         return;
    }

    QString strText;
    uchar *p = (uchar*)pBuf;


    if(p[0] == 0xEF && p[1] == 0xBB && p[2] == 0xBF)// UTF-8
    {
        ui->list->addItem(tr("UTF-8"));
        strText = QString::fromUtf8(pBuf + 3, fileSize - 3);
    }
    else if(p[0] == 0xFF && p[1] == 0xFE)// Unicode
    {
        ui->list->addItem(tr("Unicode"));
        strText = QString::fromWCharArray((wchar_t*)(pBuf + 2), (fileSize - 2) / 2);
    }
    else if(p[0] == 0xFE && p[1] == 0xFF)// Unicode big endian
    {
        ui->list->addItem(tr("Unicode big endian"));
        uchar uc = 0;
        for(int i = 3; i < fileSize; i += 2)
        {
            uc = p[i];
            p[i] = p[i - 1];
            p[i - 1] = uc;
        }
        strText = QString::fromWCharArray((wchar_t*)(pBuf + 2), (fileSize - 2) / 2);
    }
    else    //ANSI
    {       

        ui->list->addItem(tr("ANSI"));
        strText = QString::fromLocal8Bit(pBuf, fileSize);
    }

    ui->list->addItem(strText);

    QString strMsg, strTmp;

    //unicode
    strMsg = tr("unicode: ");
    QChar *pData = strText.data();
    for(int i = 0; i < strText.size(); i++)
    {
        strTmp = tr("0x%1, ").arg(QString::number(pData[i].unicode(), 16).toUpper());
        strMsg += strTmp;
    }
    ui->list->addItem(strMsg);


    // gb2312
    strMsg = tr("gb2312:  ");
    QByteArray ary1 = strText.toLocal8Bit();
    uchar *puchar = (uchar*)ary1.data();
    for(int i = 0; i < ary1.size(); i++)
    {
        strTmp = tr("0x%1, ").arg(QString::number(puchar[i], 16).toUpper());
        strMsg += strTmp;
    }
    ui->list->addItem(strMsg);

    // uft8
    strMsg = tr("utf-8:   ");
    ary1 = strText.toUtf8();
    puchar = (uchar*)ary1.data();
    for(int i = 0; i < ary1.size(); i++)
    {
        strTmp = tr("0x%1, ").arg(QString::number(puchar[i], 16).toUpper());
        strMsg += strTmp;
    }
    ui->list->addItem(strMsg);

    ui->list->addItem(tr(" "));
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值