所以我有一个QT文本编辑器,我已经开始创建了。我从这个http://doc.qt.io/archives/qt-5.7/gettingstartedqt.html开始,我已经添加了它。到目前为止,我添加了一个正确的保存/保存功能(链接中的版本只有一个保存为功能),一个“查找”功能和一个“打开新窗口”功能。很快,我将添加一个查找和替换功能。
我主要是为了学习体验而这样做,但我最终还会添加一些功能,这些功能将特别帮助我在工作中创建PLC配置文件。这些配置文件可能有许多不同的编码,但大多数似乎都是UTF-16LE(根据Emacs无论如何。)我的文本编辑器最初读取UTF-16LE没有问题,但是用纯文本写道,我需要改变这一点。
以下是其中一个UTF16-LE文件的编码系统的Emacs描述的片段。
U -- utf-16le-with-signature-dos (alias: utf-16-le-dos)
UTF-16 (little endian, with signature (BOM)).
Type: utf-16
EOL type: CRLF
This coding system encodes the following charsets:
unicode
以下是我用于在QT文本编辑器中对文本进行编码的代码示例。
首先......这与我之前提供的链接类似。这里唯一的区别是“saveFile”是我创建的全局变量,用于执行简单的“保存”功能而不是“另存为”功能。这将文本保存为纯文本,并像魅力一样工作。
void findreplace::on_actionSave_triggered()
{
if (!saveFile.isEmpty())
{
QFile file(saveFile);
if (!file.open(QIODevice::WriteOnly))
{
// error message
}
else
{
QTextStream stream(&file);
stream << ui->textEdit->toPlainText();
stream.flush();
file.close();
}
}
}
以下是我的新版本,它试图将代码保存在“UTF-16LE”中。我的文本编辑器在保存后可以正常阅读文本,但Emacs根本不会阅读它。这对我来说,读取它的程序可能无法读取配置文件。有些东西改变了,不知道是什么。
void findreplace::on_actionSave_triggered()
{
if (!saveFile.isEmpty())
{
QFile file(saveFile);
if (!file.open(QIODevice::WriteOnly))
{
// error message
}
else
{
QTextStream stream(&file);
stream << ui->textEdit->toPlainText();
stream.setCodec("UTF-16LE");
QString stream3 = stream.readAll();
//QString stream2 = stream3.setUnicode();
//QTextCodec *codec = QTextCodec::codecForName("UTF-16LE");
//QByteArray stream2 = codec->fromUnicode(stream3);
//file.write(stream3);
stream.flush();
file.close();
}
}
}
注释掉的部分我也试过,但他们最终将文件写成亚洲(中文或日文)字符。就像我说的我的文本编辑器(和Wine中的记事本)可以很好地读取文件,但Emacs现在在保存后将编码描述如下。
= -- no-conversion (alias: binary)
Do no conversion.
When you visit a file with this coding, the file is read into a
unibyte buffer as is, thus each byte of a file is treated as a
character.
Type: raw-text (text with random binary characters)
EOL type: LF
这向我表明文件中的内容不正确。最终,此文本编辑器将用于一次创建多个文本文件,并通过用户输入修改其内容。如果我能正确地编码,那就太好了。
答案 0 :(得分:1)
感谢在这里评论我的帖子的善良研究员,我能够回答我自己的问题。这段代码解决了我的问题。
void findreplace::on_actionSave_triggered()
{
if (!saveFile.isEmpty())
{
QFile file(saveFile);
if (!file.open(QIODevice::WriteOnly))
{
// error message
}
else
{
QTextStream stream(&file);
stream.setCodec("UTF-16LE");
stream.setGenerateByteOrderMark(true);
stream << ui->textEdit->toPlainText();
stream.flush();
file.close();
}
}
}
我设置了流的编解码器,然后将生成BOM设置为“True”。我想我还有更多关于编码的知识。我认为必须将字节顺序标记设置为特定值或其他东西。我不知道我只需将此值设置为“True”并且它将自行处理。 Emacs现在可以读取通过使用此代码保存文档而生成的文件,并且Emacs的编码文档也是相同的。我最终会为用户添加选项,以便在保存时选择所需的编码。很高兴我能在这里学到一些东西。