J'ai un fichier que j'ai créé (dans vim), à des fins de test (test de sortie UTF-8 dans un client SSH). Cependant, des choses étranges se produisent dans ce fichier.
Je me suis demandé quels octets étaient dans le fichier, alors j'ai utilisé hexdump
:
[email protected]:~$ hexdump -x intl.txt
0000000 9ecf 000a
0000003
Ok, il y a quatre octets là-dedans, comment le 00 et le 0a sont entrés là-dedans, je ne suis pas clair, mais peu importe. Mais c'est là que ça devient bizarre :
[email protected]:~$ ls -al intl.txt
-rw-rw-r-- 1 username username 3 Mar 26 15:14 intl.txt
Attendez, c'est trois octets? Que se passe-t-il ici ?
Comme si ce n'était pas assez étrange, hexdump -C
donne une sortie très différente :
[email protected]:~$ hexdump -C intl.txt
00000000 cf 9e 0a |...|
00000003
Vim est également un peu confus à propos du fichier. Quand je le démarre, il donne ceci dans la ligne d'état :
"intl.txt" 1L, 3C
En haut, cependant, je reçois ceci (en utilisant set list
):
Ϟ$
~
~
~
~
Donc, il pense qu'il y a 3 caractères, mais n'en imprime qu'un. Je pourrais comprendre s'il imprimait la koppa et une ligne blanche en dessous…
Réponse acceptée :
Comme d'autres l'ont souligné, c'est parce que hexdump -x
traite les fichiers comme contenant des mots de 2 octets. Sur les systèmes Little Endian (presque tous les ordinateurs de bureau le sont), cela signifie que les octets seront échangés avant d'être affichés. Cela signifie que les valeurs d'octets sont imprimées par paires et que l'ordre de ces octets est permuté. Puisque vous avez un nombre impair d'octets, hexdump
ajoute juste un zéro pour constituer la paire finale. Le zéro est ensuite échangé avec le 0a
. Ceci est un comportement documenté pour hexdump
, donc il ne vous ment pas !
Utilisation de hexdump -C
est une meilleure commande pour obtenir une sortie formatée qui affiche les octets dans l'ordre dans lequel ils se trouvent dans le fichier. Aussi le 0a
est une nouvelle ligne et a probablement été ajoutée discrètement par celui qui a créé le fichier (vim
le fait par défaut). Par exemple, echo
ajoutera toujours une nouvelle ligne si vous ne lui dites pas de ne pas le faire. Dans bash
:
echo -e '\xcf\x9e' | hexdump -C
donnera le même résultat, mais en supprimant la nouvelle ligne avec -n
donnera ce que vous attendiez :
echo -ne '\xcf\x9e' | hexdump -C
Pour arrêter vim
de l'ajout de la nouvelle ligne :
:set noeol
:set binary