Стандарт ECMA-48 («escape-последовательности ANSI») описывает два способа кодирования набора управляющих кодов C1: использование двухсимвольных последовательностей ESC или, альтернативно, использование 8-разрядных управляющих символов.
В статьях Википедии объясняется, что двухсимвольные последовательности ESC больше подходят для использования с UTF-8.
Цитирование из escape-кода ANSI:
Стандарт гласит, что в 8-битных средах эти двухбайтовые последовательности могут быть объединены в один управляющий код C1 в диапазоне 0x80–0x9F. Однако на современных устройствах эти коды часто используются для других целей, таких как части UTF-8 или для символов CP-1252, поэтому используется только 2-байтовая последовательность.
и из контрольных кодов C0 и C1:
Символам C1 в Unicode требуется 2 байта для кодирования в UTF-8 (например, CSI в U+009B кодируется как байты 0xC2, 0x9B в UTF-8). Таким образом, соответствующие функции управления чаще доступны с использованием эквивалентной двухбайтовой escape-последовательности, предназначенной для использования с системами, которые имеют только 7-битные байты.
Есть ли какие-либо инструменты командной строки, которые можно использовать для прямого преобразования 8-битных управляющих символов C1 (как указано в ECMA-48) в двухсимвольные последовательности ESC?
Моя лучшая попытка на данный момент - попытаться использовать iconv
:
$ printf $(echo -en "\x9b") | iconv --from-code=ANSI_X3.4 --to-code=UTF-8 | od -t x1
iconv: illegal input sequence at position 0
В целях отладки я использую od -t x1
для перевода результата обратно в шестнадцатеричное. Результат, который я надеюсь получить, будет таким же, как результат выполнения:
$ printf $(echo -en "\x27[") | od -t x1
0000000 27 5b
0000002
Другими словами, существует ли инструмент командной строки, в котором вы можете передать по каналу управляющий символ C1, например, \x9b
и получить управляющую последовательность, например, \x27[
?
РЕДАКТИРОВАТЬ: Или, как справедливо предлагает egmont, более уместно, интерактивный инструмент, а не то, что вы трубите в.