`cat -v` para caracteres UTF no ASCII que no se imprimen

`cat -v` para caracteres UTF no ASCII que no se imprimen

cattiene una -vopció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 catla 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 -vutilizará 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 -vhacerlo:

^@^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-Brepresenta 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-xy ^xse 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 catimplementaciones pueden tener su propio comportamiento como-v no eses una catopción estándar, pero tanto GNU cat como las versiones BSD comunes se comportan de esta manera.

información relacionada