Ho un file che ho creato (in vim), a scopo di test (test dell'output UTF-8 in un client SSH). Cose strane, tuttavia, stanno accadendo a questo file.
Mi chiedevo quali byte ci fossero nel file, quindi ho usato hexdump
:
[email protected]:~$ hexdump -x intl.txt
0000000 9ecf 000a
0000003
Ok, ci sono quattro byte lì dentro, come sono entrati lo 00 e lo 0a, non sono chiaro, ma qualunque cosa. Ecco dove diventa strano, però:
[email protected]:~$ ls -al intl.txt
-rw-rw-r-- 1 username username 3 Mar 26 15:14 intl.txt
Aspetta, sono tre byte? Cosa sta succedendo qui?
Come se non fosse abbastanza strano, hexdump -C
fornisce un output molto diverso:
[email protected]:~$ hexdump -C intl.txt
00000000 cf 9e 0a |...|
00000003
Vim è anche un po' confuso riguardo al file. Quando lo avvio, nella riga di stato viene visualizzato questo:
"intl.txt" 1L, 3C
In alto, tuttavia, ottengo questo (usando set list
):
Ϟ$
~
~
~
~
Quindi, pensa che ci siano 3 caratteri, ma ne stampa solo uno. Potrei capire se stampasse la koppa e una riga vuota sotto di essa...
Risposta accettata:
Come altri hanno sottolineato, ciò è dovuto al fatto che hexdump -x
tratta i file come contenenti parole a 2 byte. Sui sistemi little endian (quasi tutti i desktop lo sono), questo significa che i byte verranno scambiati prima di essere visualizzati. Ciò significa che i valori dei byte vengono stampati a coppie e che l'ordine di questi byte viene scambiato. Dato che hai un numero dispari di byte, hexdump
aggiunge solo uno zero per formare la coppia finale. Lo zero viene quindi scambiato con il 0a
. Questo è un comportamento documentato per hexdump
, quindi non ti sta mentendo!
Usando hexdump -C
è un comando migliore per ottenere un output formattato che mostra i byte nell'ordine in cui sono nel file. Anche il 0a
è una nuova riga ed è stata probabilmente aggiunta tranquillamente da qualunque cosa abbia creato il file (vim
lo fa per impostazione predefinita). Ad esempio, echo
aggiungerà sempre una nuova riga se non gli dici di non farlo. In bash
:
echo -e '\xcf\x9e' | hexdump -C
darà lo stesso risultato, ma sopprimendo la nuova riga con -n
darà quello che ti aspettavi:
echo -ne '\xcf\x9e' | hexdump -C
Per fermare vim
dall'aggiunta della nuova riga:
:set noeol
:set binary