Qt C++文本编辑器UTF-16LE编码保存异常问题求助
解决Qt编辑器保存UTF-16LE文件被Emacs识别为二进制的问题
看起来你遇到的核心问题是编码设置时机错误加上缺少UTF-16LE必需的字节序标记(BOM),导致Emacs无法正确识别文件编码。我们来一步步修复这个问题:
问题分析
你的修改代码有两个关键错误:
- 你在写入文本之后才调用
setCodec("UTF-16LE"),这时候内容已经用Qt默认的编码(通常是UTF-8)写入文件了,后续的编码设置完全无效。 - 你尝试对
WriteOnly模式打开的文件调用readAll(),这是非法操作,根本不会生效。 - UTF-16LE编码的文件通常需要开头的BOM(
FF FE字节),Emacs这类工具依赖这个标记来判断文件是UTF-16LE,而不是二进制文件。
修复后的代码
void findreplace::on_actionSave_triggered() { if (!saveFile.isEmpty()) { QFile file(saveFile); if (!file.open(QIODevice::WriteOnly)) { // 这里可以添加错误提示,比如弹出消息框 QMessageBox::warning(this, tr("保存错误"), tr("无法打开目标文件进行写入")); return; } QTextStream stream(&file); // 1. 先设置编码为UTF-16LE stream.setCodec("UTF-16LE"); // 2. 生成UTF-16LE的字节序标记(BOM),这是Emacs识别编码的关键 stream.setGenerateByteOrderMark(true); // 3. 写入文本内容 stream << ui->textEdit->toPlainText(); stream.flush(); file.close(); } }
关键说明
- 编码设置时机:必须在写入任何内容之前调用
setCodec,这样QTextStream才会用指定的编码处理后续的写入操作。 - BOM的作用:
setGenerateByteOrderMark(true)会在文件开头写入FF FE字节,这是UTF-16LE的标准标识。Emacs看到这个标记后,就能正确识别文件为UTF-16LE编码,而不是当成二进制文件。 - 特殊情况处理:如果你的PLC配置文件要求无BOM的UTF-16LE,可以去掉
setGenerateByteOrderMark(true),但这时候你可能需要手动告诉Emacs文件编码(比如在Emacs中用C-x RET f utf-16le RET),或者确保PLC工具能识别无BOM的UTF-16LE。
这样修改后,你的文件应该能被Emacs和PLC配置工具正确识别了。
内容的提问来源于stack exchange,提问作者CigEmacs




