UTF-16LE 编码问题与 Qt 文本编辑器用 C++ 编写
UTF-16LE Encoding woes with Qt text editor written in C++
所以我有一个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
这向我表明文件中的某些内容不正确。最终,此文本编辑器将用于一次创建多个文本文件,并通过用户输入修改其内容。如果我能正确进行这种编码,那就太好了。
感谢在这里评论我的帖子的好心人,我能够回答我自己的问题。这里的这段代码解决了我的问题。
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 的编码文档是相同的。我最终会为用户添加选项,以选择他们在保存时需要的编码。很高兴我能够在这里学到一些东西。
- 我无法在Visual Studio代码中使用CIN输入答案,它说输入您的年龄,但它说只读文本编辑器如何解决这个问题?
- "未定义对'WinMain@16'的引用"gcc 编辑器中的错误
- 如何从C++而不是虚幻编辑器中添加静态网格体组件的值?
- UE4 - Visual Studio在我从编辑器添加新的c ++文件后无法打开任何源文件 - UBT_COMPILED
- 图标编辑器中的自定义颜色 (VS 2015)
- Qt的QFontMetrics::horizontalAdvance()缺少代码编辑器实现
- 如何在文本编辑器中处理 [-Wc++11-extensions]
- C++链接编辑器找不到函数声明(未定义的引用)
- 如何将按钮添加到节点的属性编辑器面板,该面板调用该节点内的方法?
- QT创建者(4.2.2)编辑器中的独特指针导航
- 带有cmake的qtCreator,编辑器中未正确解析__cplusplus值
- 检查重叠时,虚幻编辑器会崩溃
- 如何在Windows中将使用Qt制作的记事本设置为默认文本编辑器
- 尝试在自定义 QT 创建器文本编辑器中创建查找和替换循环.我似乎无法设置光标位置
- UTF-16LE 编码问题与 Qt 文本编辑器用 C++ 编写
- Qt无法手动连接到任何插槽(UI编辑器)
- 编辑器(VS2019)拒绝了示例中的getline(stream,string)
- Qt委托编辑器弹出,没有父级
- 如果要调用多个成员函数,对象编辑器是否是一种好方法?
- 如何在虚幻编辑器内容浏览器中查找虚幻游戏模式