cat
tiene una -v
opción que convierte los caracteres que no se imprimen a su notación de intercalación (lo cual es útil si no queremos que el terminal interprete los caracteres de control literalmente en cat
la salida).
Pero, según tengo entendido, la notación de intercalación solo se aplica a los caracteres que no se imprimen en el alfabeto ASCII. Entonces, ¿qué pasa con los caracteres no imprimibles en UTF que no caen en ASCII (por ejemplo,https://www.compart.com/en/unicode/category/Cc)? ¿Qué notación se cat -v
utilizará para mostrarlos?
Respuesta1
Podemos generar un archivo que contenga los primeros 256 caracteres Unicode en UTF-8 con:
python3 -c 'for x in range(0,255): print(chr(x), end="")' > unicode-file
Eso incluye los controles que no son ASCII (C1) en el Suplemento Latin-1 y también muchos caracteres de impresión.
Ahora podemos cat -v
hacerlo:
^@^A^B^C^D^E^F^G^H
^K^L^M^N^O^P^Q^R^S^T^U^V^W^X^Y^Z^[^\^]^^^_ !"#$%&'()*+,-./0123456789:;
<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~^?
M-BM-^@M-BM-^AM-BM-^BM-BM-^CM-BM-^DM-BM-^EM-BM-^FM-BM-^GM-BM-^HM-BM-^I
M-BM-^JM-BM-^KM-BM-^LM-BM-^MM-BM-^NM-BM-^OM-BM-^PM-BM-^QM-BM-^RM-BM-^S
M-BM-^TM-BM-^UM-BM-^VM-BM-^WM-BM-^XM-BM-^YM-BM-^ZM-BM-^[M-BM-^\M-BM-^]
M-BM-^^M-BM-^_M-BM- M-BM-!M-BM-"M-BM-#M-BM-$M-BM-%M-BM-&M-BM-'M-BM-(M-B
M-)M-BM-*M-BM-+M-BM-,M-BM--M-BM-.M-BM-/M-BM-0M-BM-1M-BM-2M-BM-3M-BM-4M-B
M-5M-BM-6M-BM-7M-BM-8M-BM-9M-BM-:M-BM-;M-BM-<M-BM-=M-BM->M-BM-?M-CM-^@
M-CM-^AM-CM-^BM-CM-^CM-CM-^DM-CM-^EM-CM-^FM-CM-^GM-CM-^HM-CM-^IM-CM-^J
M-CM-^KM-CM-^LM-CM-^MM-CM-^NM-CM-^OM-CM-^PM-CM-^QM-CM-^RM-CM-^SM-CM-^T
M-CM-^UM-CM-^VM-CM-^WM-CM-^XM-CM-^YM-CM-^ZM-CM-^[M-CM-^\M-CM-^]M-CM-^^
M-CM-^_M-CM- M-CM-!M-CM-"M-CM-#M-CM-$M-CM-%M-CM-&M-CM-'M-CM-(M-CM-)M-C
M-*M-CM-+M-CM-,M-CM--M-CM-.M-CM-/M-CM-0M-CM-1M-CM-2M-CM-3M-CM-4M-CM-5M-C
M-6M-CM-7M-CM-8M-CM-9M-CM-:M-CM-;M-CM-<M-CM-=M-CM->
(Lo he envuelto manualmente para que sea legible)
Puedes ver que representa U+0080 al comienzo de la cuarta línea, que es UTF-8 C2 80
, como M-BM-^@
. M-B
representa el byte C2: B es 0x42, por lo que M-
representa establecer el bit alto (es decir, agregar 0x80). M-^@
está haciendo lo mismo para un byte nulo (meta-ctrl-@): la notación M-x
y ^x
se combina.
Lo mismo sucederá con todos los puntos de código que no sean ASCII, que consistirán enteramente en bytes altos en UTF-8, o todos los bytes 128-255 en cualquier otra codificación. Diferentes cat
implementaciones pueden tener su propio comportamiento como-v
no eses una cat
opción estándar, pero tanto GNU cat como las versiones BSD comunes se comportan de esta manera.