Как мне преобразовать файлы DOS ANSI (CP 437) в Unix ANSI с помощью Unicode?

Файлы ANSI с http://blocktronics.org/ похоже, используют другую кодировку ANSI, чем та, которая поддерживается в моем эмуляторе терминала VT100.

Если я просматриваю эти файлы с tetraviewони выглядят прилично. Но если я смотрю на них с less -r символы блока не работают. Если я использую iconv -f 437 -t utf-8 | less -r, символы блока работают, но выравнивание символов все еще испорчено. Работает в tetraviewтак что, должно быть, происходит какое-то обращение.

Я написал скрипт для очистки содержимого экрана tetraview работает в tmux, но это взлом, и я хотел бы сделать преобразование, которое tetraview делает сам

3 ответа

Решение

Есть две проблемы:

В dman-warrior.ANSЕсть два типа используемых escape-последовательностей. Первый используется только один раз и является первым в файле. это ESC[0mи сбрасывает все атрибуты графического режима. Второй типESC[<value>C (например ESC[24C) и он перемещает курсор <value> символы вперед (вправо). Если курсор не может идти дальше, он останавливается. Вы можете проверить это в своем терминале с помощью этой команды оболочки:

printf '\x1b[10000CXYZ\n'

Это должно выглядеть так:

|$ printf '\x1b[10000CXYZ\n'              |
|                                        X|
|YZ                                       |
|$                                        |

Файл изображения содержит всего несколько строк (разделенных CRLF). Каждый из них переносится на ширину терминала (80 столбцов), создавая таким образом несколько строк экрана.

Изображение в порядке до первой строки экрана, начиная сESC[<value>Cescape-последовательность в середине строки файла.

  • Терминал записывает предыдущую строку экрана, заканчивающуюся последним столбцом.
  • ESC[<value>C escape-последовательность встречается Находясь в последнем столбце, курсор не может двигаться дальше вправо, поэтому последовательность игнорируется.
  • Далее следует символ, который заставляет строку переноситься и печатается на следующей строке экрана.

В новой строке экрана отсутствует пустое место, которое должно быть пропущено escape-последовательностью.

Возможные решения

  • Как-то изменить поведение эмулятора терминала. (Понятия не имею как, кроме компиляции настраиваемой версии.)
  • Явно ломать линии. Если ESC[<value>C является единственной escape-последовательностью, достаточно просто написать программу, которая исправляет изображения.

Все эти файлы имеют тип "Ansimation", который зависит от определенной ширины экрана и высоты для его отображения. Ваш терминал, вероятно, не имеет правильную ширину.

Литтлимп был несколько верным.

Многие произведения искусства ANSI предназначены для терминалов, размеры которых шире стандартных 80-дневных столбцов. Янус ошибается, что это искусство сделано только для 80 колонн. Тщательный визуальный осмотр показал бы, что некоторые используют намного больше символов в строке.

В отличие от большинства стандартных текстовых файлов, многие художественные файлы ANSI содержат / не содержат / содержат CR или CR/LF для завершения конца каждой строки, но вместо этого позволяют терминалу переходить к следующей строке для них. Это дает им возможность использовать полные столбцы терминала, например, 80 или 132, без необходимости использовать CRLF до конца строки, делая максимальную ширину 79 или 131.

Так, например, для blocktronicks goo-b7.ans не будет отображаться правильно ни в одном терминале, кроме 160 символов в ширину.

Я проиллюстрировал это на примере изображения ANSI здесь:

Стандартные приемы sed / awk для вставки возврата каретки после каждых символов X не будут работать, поскольку короткие строки, оканчивающиеся на CR/LF, не будут пропущены, а скорее вычтены из длины следующей строки, прежде чем CR будет вставлен в неподходящем месте. место.

Чтобы преобразовать эти файлы во что-то более разумное, потребуется программа / скрипт, который проходит по каждой строке, вставляя CR только тогда, когда найдена строка с максимальной длиной строки.

Я искал онлайн и нашел автоматический конвертер, который вам не нужно устанавливать. http://www.gofunnow.com/convertutf8/convertutf8.php?destencoding=-2

Другие вопросы по тегам