Tengo un archivo que creé (en vim), con fines de prueba (probando la salida UTF-8 en un cliente SSH). Sin embargo, le están sucediendo cosas extrañas a este archivo.
Me preguntaba qué bytes había en el archivo, así que usé hexdump
:
[email protected]:~$ hexdump -x intl.txt
0000000 9ecf 000a
0000003
Ok, hay cuatro bytes allí, cómo llegaron allí el 00 y el 0a, no lo tengo claro, pero lo que sea. Sin embargo, aquí es donde se pone raro:
[email protected]:~$ ls -al intl.txt
-rw-rw-r-- 1 username username 3 Mar 26 15:14 intl.txt
Espera, ¿son tres bytes? ¿Qué está pasando aquí?
Como si eso no fuera lo suficientemente extraño, hexdump -C
da una salida muy diferente:
[email protected]:~$ hexdump -C intl.txt
00000000 cf 9e 0a |...|
00000003
Vim también está un poco confundido acerca del archivo. Cuando lo inicio, da esto en la línea de estado:
"intl.txt" 1L, 3C
Arriba, sin embargo, obtengo esto (usando set list
):
Ϟ$
~
~
~
~
Entonces, cree que hay 3 caracteres, pero solo imprime uno. Podría entender si imprimiera el koppa y una línea en blanco debajo...
Respuesta aceptada:
Como han señalado otros, esto se debe a que hexdump -x
trata los archivos como si contuvieran palabras de 2 bytes. En los sistemas little endian (casi todos los escritorios lo son), esto significa que los bytes se intercambiarán antes de que se muestren. Esto significa que los valores de los bytes se imprimen en pares y que se intercambia el orden de estos bytes. Como tiene un número impar de bytes, hexdump
simplemente agrega un cero para formar el par final. Luego, el cero se intercambia con el 0a
. Este es un comportamiento documentado para hexdump
, ¡así que no te está mintiendo!
Usando hexdump -C
es un mejor comando para obtener una salida formateada que muestre los bytes en el orden en que están en el archivo. También el 0a
es una nueva línea y probablemente fue agregada silenciosamente por lo que sea que creó el archivo (vim
hace esto por defecto). Por ejemplo, echo
siempre agregará una nueva línea si no le dices que no lo haga. En bash
:
echo -e '\xcf\x9e' | hexdump -C
dará el mismo resultado, pero suprimiendo la nueva línea con -n
te dará lo que esperabas:
echo -ne '\xcf\x9e' | hexdump -C
Para detener vim
de agregar la nueva línea:
:set noeol
:set binary