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中中文处理-编码格式转换_第1张图片
Qt中中文处理-编码格式转换_第2张图片
Qt中中文处理-编码格式转换_第3张图片

原因分析

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的文件时就不会出现乱码了。
Qt中中文处理-编码格式转换_第4张图片
同样地,如果要写中文字符串到gbk的文件中,就需要用到fromUnicode函数了。
如下:

 file.open(QIODevice::Append);
 file.write(codec->fromUnicode("我们是一家人"));
 file.close();

这样,我们再次打开该gbk文件时,就发现不是乱码正常写入了。Qt中中文处理-编码格式转换_第5张图片

你可能感兴趣的:(技术,qt,ui,开发语言)