C++ 用C+编写的Qt文本编辑器的UTF-16LE编码问题+;

C++ 用C+编写的Qt文本编辑器的UTF-16LE编码问题+;,c++,qt,encoding,emacs,utf-16le,C++,Qt,Encoding,Emacs,Utf 16le,因此,我已经开始创建一个QT文本编辑器。我是从这个开始的,我在上面加了一些。到目前为止,我已经添加了一个适当的保存/另存为功能(链接中的版本实际上只有一个保存为功能)、一个“查找”功能和一个“打开新窗口”功能。很快,我将添加一个查找和替换函数 我这样做主要是为了学习经验,但我最终还将添加一些功能,专门帮助我在工作中创建PLC配置文件。这些配置文件可能有许多不同的编码,但大多数似乎都是UTF-16LE(根据Emacs的说法)。我的文本编辑器最初读取UTF-16LE没有问题,但用纯文本编写,我需要更

因此,我已经开始创建一个QT文本编辑器。我是从这个开始的,我在上面加了一些。到目前为止,我已经添加了一个适当的保存/另存为功能(链接中的版本实际上只有一个保存为功能)、一个“查找”功能和一个“打开新窗口”功能。很快,我将添加一个查找和替换函数

我这样做主要是为了学习经验,但我最终还将添加一些功能,专门帮助我在工作中创建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”是一个全局变量,我创建它是为了执行一个简单的“Save”函数,而不是“Save As”函数。这会将文本保存为纯文本,并像符咒一样工作

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();

        }
    }


}

这向我表明文件中存在不正确的内容。最终,该文本编辑器将用于一次创建多个文本文件,并通过用户输入修改其内容。如果我能正确地使用这种编码,那就太好了。

感谢好心的同事在我的帖子上发表评论,我能够回答我自己的问题。这个代码解决了我的问题

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();

        }
    }


}
void findreplace::on_actionSave_triggered()
{
如果(!saveFile.isEmpty())
{
QFile文件(saveFile);
如果(!file.open(QIODevice::WriteOnly))
{
//错误消息
}
其他的
{
QTextStream流(&文件);
流编解码器(“UTF-16LE”);
stream.setGenerateByteOrderMark(true);
流文本编辑->toPlainText();
stream.flush();
file.close();
}
}
}

我设置流的编解码器,然后将生成BOM设置为“True”。我想我还有更多关于编码的知识要学习。我认为字节顺序标记必须设置为一个特定的值或什么的。我没有意识到我只需要将这个值设置为“True”,它就会自行处理。Emacs现在可以读取通过使用此代码保存文档而生成的文件,来自Emacs的编码文档与此相同。我最终会添加选项,让用户在保存时选择所需的编码。很高兴我能在这里学到一些东西

我看不出你在哪里写的这本书很可能暴露了我的无知,在这里。在我的研究中,我发现了一些这方面的东西,但不清楚如何使用QTextCodec专门编写。在将所有数据写入流之后设置编解码器是毫无意义的。
= -- 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
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();

        }
    }


}