Certains éditeurs de texte, lorsqu'ils convertissent un fichier, placent en tête une marque appelée BOM
(Bit Order Mark).
Cette marque est inintelligible pour de nombreuses applications, notamment les compilateurs...
[Sur la raison d'être de cette marque, voir le codage UTF-16
dans le cours n° 4.
Les éditeurs en question posent un BOM même en UTF-8, alors que ce n'est pas indispensable].
Exemple :
Le fichier ChBinaireU.cpp a été obtenu par conversion en Unicode UTF-8,
pour travailler sous MacOS X,
à partir d'un fichier ChBinaire.cpp (reçu par mél) qui était en codage Windows.
On essaie de le compiler :
jfp% gcc ChBinaireU.cpp
ChBinaireU.cpp:1: error: stray '\239' in program
ChBinaireU.cpp:1: error: stray '\187' in program
ChBinaireU.cpp:1: error: stray '\191' in program
ChBinaireU.cpp:1: error: stray '#' in program
............
Voyons ce qu'il en est :
jfp% hexdump -C -n128 ChBinaireU.cpp
00000000 ef bb bf 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 |...#include <std|
00000010 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c |io.h>.#include <|
00000020 69 6f 73 74 72 65 61 6d 3e 0a 0a 23 69 6e 63 6c |iostream>..#incl|
00000030 75 64 65 20 22 62 69 6e 61 69 72 65 55 2e 68 22 |ude "binaireU.h"|
..................
On voit clairement au début du fichier les trois octets "parasites" 0xEF, 0xBB et 0xBF (239, 187 et 191 en octal).
Ah oui ! Il aurait fallu choisir l'option "UTF-8 - no BOM" lors de la conversion...
Trop tard !
Maintenant, il faut enlever ces trois octets pour pouvoir compiler
le fichier, et pour cela trouver un éditeur de texte adéquat.
Le problème vient de ce que notre éditeur de texte favori va probablement "comprendre" le BOM
et par conséquent il ne va pas nous l'afficher, nous privant ainsi de la possibilité de le supprimer !
C'est par exemple l'attitude de ed, le plus basique éditeur sous Unix :
jfp% ed ChBinaireU.cpp
5441
1,5 p
#include <stdio.h>
#include <iostream>
#include "binaireU.h"
Pas trace de nos trois octets en début de fichier !
Il nous faut recourir à emacs : la commande emacs ChBinaireU.cpp fait apparaître à l'écran
File Edit Options Buffers Tools C++ Help
???#include <stdio.h>
#include <iostream>
#include "binaireU.h"
....................
où les trois octets non-imprimables apparaissent comme trois points d'interrogation
ce qui nous permet de les éliminer.
Ouf !