Как мне преобразовать файлы 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 ответа
Есть две проблемы:
- Кодирование необходимо преобразовать из CP 437 в кодировку вашего терминала. Это сделано с помощью
iconv -f 437 input_file.ANS
как вы уже обнаружили. - Экранирующие последовательности ANSI должны быть исправлены.
В 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>C
escape-последовательность в середине строки файла.
- Терминал записывает предыдущую строку экрана, заканчивающуюся последним столбцом.
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