UTF-16LE Кодирование бед с текстовым редактором Qt, написанным в Stack Overflow

Итак, у меня есть текстовый редактор QT, который я начал создавать. Я начал с этого http://doc.qt.io/archives/qt-5.7/gettingstartedqt.html и я добавил к этому. До сих пор я добавил правильное сохранение / сохранение как функцию (версия в ссылке действительно имеет только функцию сохранения как), функцию «найти» и функцию «открыть новое окно». Очень скоро я добавлю функцию поиска и замены.

В основном я делаю это для обучения, но я также собираюсь добавить еще несколько функций, которые помогут мне создавать файлы конфигурации ПЛК на работе. Эти файлы конфигурации могут быть в разных кодировках, но большинство из них, похоже, в 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();

}
}}

Части, которые были закомментированы, я тоже попробовал, но в итоге они записали файл в виде азиатских (китайских или японских) символов. Как я уже говорил, мой текстовый редактор (и Notepad in 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

Решение

Благодаря добрым ребятам, которые прокомментировали мой пост здесь, я смог ответить на свой вопрос. Этот код здесь решил мою проблему.

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 такая же. В конечном итоге я добавлю опции, чтобы пользователь мог выбрать, какую кодировку ему нужно при сохранении. Рад, что мне удалось чему-то научиться здесь.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]