Как преобразовать файлы 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 делает сам.


person Janus Troelsen    schedule 02.12.2013    source источник
comment
Можете ли вы уточнить, что вы подразумеваете под выравниванием, все еще испорченным? Кроме того, в какой системе вы используете iconv?   -  person theannouncer    schedule 10.12.2013
comment
@zatch_rulz: iconv работает на Ubuntu Saucy. Вот что я имею в виду, когда говорю, что выравнивание нарушено: i.imgur.com/Lf0RF1u.png Справа тетравью, слева значоквывод. Оба терминала 80x24. Файл на скриншоте dman-warrior.ANS из ACiD Trip   -  person Janus Troelsen    schedule 10.12.2013
comment
Просто чтобы сэкономить время будущим читателям: tetraview является частью Tetradraw.   -  person Palec    schedule 11.12.2013


Ответы (4)


Возникают две проблемы:

  • Кодировка должна быть преобразована из 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 столбцов), что дает несколько строк экрана.

С изображением все в порядке до первой строки экрана, начинающейся с escape-последовательности ESC[<value>C в середине строки файла.

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

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

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

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

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

person littleimp    schedule 10.12.2013
comment
Мой терминал имеет стандартный размер 80x24. Поскольку это стандартная ширина и для DOS, и tetraview успешно отображает изображение в таком терминале, я не думаю, что это проблема. - person Janus Troelsen; 11.12.2013

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

person GJH105775    schedule 10.12.2013
comment
Этот сайт использует другое определение ANSI, возможно, они просто ссылаются на CP-1251. В любом случае, это не дает никаких преимуществ перед iconv. - person Janus Troelsen; 11.12.2013

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

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

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

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

Я проиллюстрировал это на образце изображения ANSI здесь: https://i.stack.imgur.com/zP8tz.png

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

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

person Dan Simmons    schedule 31.12.2018