O padrão ECMA-48 ("ANSI escape sequences") descreve duas maneiras de codificar o conjunto C1 de códigos de controle: usando sequências ESC de 2 caracteres ou, alternativamente, usando caracteres de controle de 8 bits.
Os artigos da Wikipédia explicam que as sequências ESC de dois caracteres são mais apropriadas para uso com UTF-8.
Citações de código de escape ANSI :
The standard says that in 8-bit environments these two-byte sequences can be merged into single C1 control code in the 0x80–0x9F range. However on modern devices those codes are often used for other purposes, such as parts of UTF-8 or for CP-1252 characters, so only the 2-byte sequence is used.
e de códigos de controle C0 e C1 :
The C1 characters in Unicode require 2 bytes to be encoded in UTF-8 (for instance CSI at U+009B is encoded as the bytes 0xC2, 0x9B in UTF-8). Thus the corresponding control functions are more commonly accessed using the equivalent two byte escape sequence intended for use with systems that have only 7-bit bytes.
Existe alguma ferramenta de linha de comando que pode ser usada para converter diretamente os caracteres de controle C1 de 8 bits (conforme especificado pelo ECMA-48) em duas seqüências ESC de caracteres?
Minha melhor tentativa até agora foi tentar usar 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
Para fins de depuração, estou usando od -t x1
para renderizar o resultado novamente em hexadecimal. O resultado que espero obter será o mesmo que o resultado da execução:
$ printf $(echo -en "\x27[") | od -t x1
0000000 27 5b
0000002
Em outras palavras, existe uma ferramenta de linha de comando na qual você pode canalizar um caractere de controle C1 como \x9b
e recuperar uma seqüência de escape como \x27[
?
EDIT: Ou como egmont sugere corretamente, mais apropriadamente, uma ferramenta interativa ao invés de algo que você canaliza.