如何确定文本文件是否具有Unicode BOM?

时间:2015-03-26 09:33:40

标签: c++ qt unicode byte-order-mark

如何使用Qt类检测BOM?我尝试做的是读取UTF-8文件,操纵其内容并将其写回。我可以选择使用QTextStream设置或删除BOM,但我看不到任何方法可以保留其原始状态(是否存在),因为我无法查询它。

1 个答案:

答案 0 :(得分:3)

您可以使用QTextCodec::codecForUtfText来确定字节数组是否包含BOM:

QFile *file = ...;
bool hasByteOrderMark = QTextCodec::codecForUtfText(file->peek(4), nullptr) != nullptr;
// QTextCodec is owned by Qt - don't free

作为一种快捷方式,如果QTextStream无法从流中检测到编码,您可以利用generateByteOrderMark将关闭QTextStream stream(file); stream.setAutoDetectUnicode(true); stream.setCodec(QTextCodec::codecForMib(106)); // default to UTF-8 stream.setGenerateByteOrderMark(true); stream.readLine(); // detect codec and possibly switch off generateByteOrderMark int mib = stream.codec()->mibEnum(); // detected codec, or UTF-8 (default set above) bool hasByteOrderMark = stream.generateByteOrderMark(); 的(未记录的)事实:

{{1}}

这是未记录的行为,因此如果你想依赖它,你可能想要测试。