View Issue Details

IDProjectCategoryView StatusLast Update
0002979Far ManagerEditorpublic2015-04-05 10:31
ReporterSEtAssigned To 
PrioritynormalSeverityfeatureReproducibilityN/A
Status newResolutionopen 
Product Version3.0 
Target VersionFixed in Version 
Summary0002979: Редактирование любых файлов без потерь в режиме UTF-8
DescriptionСейчас редактор Far'а крайне убого работает с файлами в многобайтовых кодировках (в частности, UTF-8), содержащими непреобразуемые символы: при чтении они заменяются на один и тот же стандартный символ-заменитель, при записи он же и пишется, напрочь убивая что там было двоичное вокруг текста.

На самом деле, никаких серьёзных причин вести себя так нет и 'неконвертируемые' символы вполне можно сохранять. Например, для UTF-8<->UTF-16 преобразования есть модификация, использующая непарные вторые части суррогатных пар для сохранения 'неконвертируемых' символов, что позволяет в лучшем случае (если все преобразования - модифицированные) выполнить без потерь конвертацию UTF-8->UTF-16->UTF-8 для любых данных, а в худшем (часть преобразований - обычные) - получить стандартное поведение с символом-заменителем.

Прилагается демо-патч к Far'у, с минимальными модификациями заменяющий его конверсии на модифицированные, что позволяет без потерь редактировать что угодно в UTF-8.
TagsNo tags attached.
Build

Activities

SEt

2015-04-02 03:09

reporter  

lossless_utf-8.diff (4,971 bytes)
lossless_utf-8.diff (4,971 bytes)

zg

2015-04-02 16:44

developer   bugnote:0013607

> что позволяет без потерь редактировать что угодно в UTF-8
открываю файл с содержимым:
EF BB BF F4 FB E2 E0
сохраняю:
EF BB BF F4 FB E2 EF BF BD
безпотерьности не наблюдаю.

SEt

2015-04-02 19:54

reporter  

lossless_utf-8_v2.diff (5,246 bytes)
lossless_utf-8_v2.diff (5,246 bytes)

SEt

2015-04-02 20:00

reporter   bugnote:0013608

Да, было такое, не всё исправил в текущем коде Far'а - в v2 версии патча концовка должна обрабатываться правильно.

Ещё безпотерьность может запороть условие после
//??? caller should be fixed to avoid this...
но я не знаю, как его адекватно вправить.

2useven10

2015-04-03 00:06

developer   bugnote:0013609

> но я не знаю, как его адекватно вправить.
Этот код выполняться не должен.
Если такое всё ещё происходит, то адекватной будет правка вызывателя.

zg

2015-04-03 03:00

developer   bugnote:0013610

4332.

2useven10

2015-04-03 06:46

developer   bugnote:0013611

Скорее всего будут проблемы в нетекстовых режимах просмотра.
Там нужно 'честное' преобразование.

SEt

2015-04-03 20:22

reporter   bugnote:0013612

Это вполне 'честное' преобразование, но, конечно, желательно везде использовать один и тот же вариант преобразования.

Сейчас шестнадцатеричный режим просмотра съезжает, так как там используется
    int clen = WideCharToMultiByte(CP_UTF8, 0, w2.data()+iw, 1, nullptr,0, nullptr,nullptr);
При замене на
    int clen = Utf8::ToMultiByte(w2.data()+iw, 1, nullptr);
всё нормализуется.

Странному коду чуть выше по угадыванию продолжения символа в начале строки это не помогает, и его хорошо бы как-то более адекватно реализовать.

2useven10

2015-04-05 09:36

developer   bugnote:0013614

Last edited: 2015-04-05 10:31

View 2 revisions

Теперь любое преобразование в UTF-8 успешное.
Ошибок не бывает. А иногда именно их и надо найти.
Можно, конечно, сделать поиск по диапазону, но это дополнительное неочевидное телодвижение.

Часть кода в старом варианте преобразования нужна только для нахождения ошибок. Вариант с двумя выходными буферами нужен (был) для того, чтобы при обратном преобразовании получить ту же длину строки, что и в оригинале.
В новом варианте, если мы на нём останавливаемся, это всё не нужно. Можно упростить, но нужна ревизия кода, где используется преобразование.

2useven10

2015-04-05 09:47

developer   bugnote:0013615

Ещё надо бы проверить смену кодировки.
Скорее всего там нужны отдельные приседания для utf-8.

Issue History

Date Modified Username Field Change
2015-04-02 03:09 SEt New Issue
2015-04-02 03:09 SEt File Added: lossless_utf-8.diff
2015-04-02 16:44 zg Note Added: 0013607
2015-04-02 19:54 SEt File Added: lossless_utf-8_v2.diff
2015-04-02 20:00 SEt Note Added: 0013608
2015-04-03 00:06 2useven10 Note Added: 0013609
2015-04-03 03:00 zg Note Added: 0013610
2015-04-03 06:46 2useven10 Note Added: 0013611
2015-04-03 20:22 SEt Note Added: 0013612
2015-04-05 09:36 2useven10 Note Added: 0013614
2015-04-05 09:47 2useven10 Note Added: 0013615
2015-04-05 10:31 2useven10 Note Edited: 0013614 View Revisions