QT 如何识别文件的编码格式

在日常开发过程中,经常会遇到读取某个文件的内容,相信大家也会遇到读取出现乱码的问题,如果我们在读取文件之前,先检测文件的编码格式,然后再在读取的时候设置对应的编码,是不是问题就解决了呢?经过笔者认(上)真(网)思(百)索(度)一番,于是有了今天这篇“自动识别文件编码”的文章。

示例代码

#include <QtCore/QCoreApplication>
#include <QTextCodec>
#include <QFile>
#include <QDebug>

enum class EncodingFormat : int
{
	ANSI = 0,//GBK
	UTF16LE,
	UTF16BE,
	UTF8,
	UTF8BOM,
};

/*!
 * \brief 检查文件编码
 */
EncodingFormat FileCharacterEncoding(const QString& fileName)
{
	//假定默认编码utf8
	EncodingFormat code = EncodingFormat::UTF8;

	QFile file(fileName);
	if (file.open(QIODevice::ReadOnly))
	{
		//读取3字节用于判断
		QByteArray buffer = file.read(3);
		quint8 sz1st = buffer.at(0);
		quint8 sz2nd = buffer.at(1);
		quint8 sz3rd = buffer.at(2);
		if (sz1st == 0xFF && sz2nd == 0xFE)
		{
			code = EncodingFormat::UTF16LE;
		}
		else if (sz1st == 0xFE && sz2nd == 0xFF)
		{
			code = EncodingFormat::UTF16BE;
		}
		else if (sz1st == 0xEF && sz2nd == 0xBB && sz3rd == 0xBF)
		{
			code = EncodingFormat::UTF8BOM;
		}
		else
		{
			//尝试用utf8转换,如果无效字符数大于0,则表示是ansi编码
			QTextCodec::ConverterState cs;
			QTextCodec* tc = QTextCodec::codecForName("utf-8");
			tc->toUnicode(buffer.constData(), buffer.size(), &cs);
			code = (cs.invalidChars > 0) ? EncodingFormat::ANSI : EncodingFormat::UTF8;
		}

		file.close();
	}

	return code;
}

如何使用?

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

	EncodingFormat code = FileCharacterEncoding(QStringLiteral("兰亭集序-ANSI.txt"));
	qDebug() << "code=" << (int)code;

	code = FileCharacterEncoding(QStringLiteral("兰亭集序-UTF-16LE.txt"));
	qDebug() << "code=" << (int)code;

	code = FileCharacterEncoding(QStringLiteral("兰亭集序-UTF-16BE.txt"));
	qDebug() << "code=" << (int)code;

	code = FileCharacterEncoding(QStringLiteral("兰亭集序-UTF-8.txt"));
	qDebug() << "code=" << (int)code;

	code = FileCharacterEncoding(QStringLiteral("兰亭集序-BOM-UTF-8.txt"));
	qDebug() << "code=" << (int)code;

    return a.exec();
}
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hellokandy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值