#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(" "));
}