Qt中中文处理-编码格式转换
问题描述
在Qt中,由于对文本的处理都是采用utf-8(Unicode字符集的一种编码方式),当遇到非utf-8的字符串时,如果不进行转换,常常会出现乱码的情况。
比如,当读取一个gbk格式的文件,然后将其显示出来时,如果采用下面的代码进行编写,则会出现显示乱码。
QString fileName=QFileDialog::getOpenFileName(this);
ui->lineEdit->setText(fileName);
QFile file(fileName);
bool bRet=file.open(QIODevice::ReadOnly);
if(bRet)
{
QByteArray array=file.readAll();
ui->textEdit->setText(array);
}
file.close();
原因分析
Qt对字符串默认是采用utf-8编码的,如果要打开gbk的文件,依然采用utf-8编码的话,当然就不识别了,显示就是乱码。
解决方案
Qt提供了一个类QTextCodec类,专门用来对字符串进行不同编码方式的转换。
其中重要的两个静态方法是:fromUnicode和toUnicode。
通过这两个静态方法可以将其他类型(如gbk)的字符串转换为utf-8字符串(采用toUnicode),或者将utf-8的字符串转换为其他类型(如gbk)的字符串(采用fromUnicode)。
QString QTextCodec::toUnicode(const QByteArray &a) const
Converts a from the encoding of this codec to Unicode, and returns the result in a QString.
QByteArray QTextCodec::fromUnicode(const QString &str) const
Converts str from Unicode to the encoding of this codec, and returns the result in a QByteArray.
修改
将以上代码修改如下,就可以解决乱码的问题。
增加两行代码:
//增加编码方式
QTextCodec* codec=QTextCodec::codecForName("gbk");
//将gbk的文本转换为utf-8后再显示
ui->textEdit->setText(codec->toUnicode(array));
修改后的代码如下:
QString fileName=QFileDialog::getOpenFileName(this);
ui->lineEdit->setText(fileName);
QFile file(fileName);
bool bRet=file.open(QIODevice::ReadOnly);
//增加编码方式
QTextCodec* codec=QTextCodec::codecForName("gbk");
if(bRet)
{
QByteArray array=file.readAll();
//将gbk的文本转换为utf-8后再显示
ui->textEdit->setText(codec->toUnicode(array));
}
file.close();
这样,再次打开该gbk的文件时就不会出现乱码了。
同样地,如果要写中文字符串到gbk的文件中,就需要用到fromUnicode函数了。
如下:
file.open(QIODevice::Append);
file.write(codec->fromUnicode("我们是一家人"));
file.close();
这样,我们再次打开该gbk文件时,就发现不是乱码正常写入了。