Qt版本
Qt5.12.2下验证无误,应该也适用于Qt5的其它版本
问题描述
使用QTextStream先读文件再写回去,发现文件编码改变了,主要代码片段如下:
// 从文件读取内容,处理内容后,重新写回原文件,发现文件编码不一致了
// 1.读文件
QFile file(targetFilePath);
file.open(QIODevice::ReadOnly | QIODevice::Text);
QTextStream ioStream(&file);
QString fileContentStr = ioStream.readAll();
file.close();
... // 2.处理文件内容 fileContentStr
// 3.写回原文件
file.open(QIODevice::WriteOnly | QIODevice::Text);
ioStream.setDevice(&file);
ioStream<<fileContentStr;
file.close();
原因与解决
如果对写文件的编码有固定的要求(比如带bom的utf-8编码,Windows VS2019下开发,含中文的源文件需要这样编码),那么需要调用QTextStream的两个关键函数:setCodec 和 setGenerateByteOrderMark,显式的指定目标文件的编码方式,仅使用默认构造的QTextStream对象是不行的。修改后代码片段如下(缩进的4行是改动部分):
// 从不带bom的utf