1035 votes

Quelle est la différence entre UTF-8 et UTF-8 avec BOM?

Quelle est la différence entre UTF-8 et UTF-8 avec BOM ?

85 votes

UTF-8 can be auto-detected better by contents than by BOM. The method is simple: try to read the file (or a string) as UTF-8 and if that succeeds, assume that the data is UTF-8. Otherwise assume that it is CP1252 (or some other 8 bit encoding). Any non-UTF-8 eight bit encoding will almost certainly contain sequences that are not permitted by UTF-8. Pure ASCII (7 bit) gets interpreted as UTF-8, but the result is correct that way too.

46 votes

Analyser de gros fichiers à la recherche de contenu UTF-8 prend du temps. Un BOM rend ce processus beaucoup plus rapide. En pratique, vous avez souvent besoin de faire les deux. Le coupable de nos jours est que beaucoup de contenu textuel n'est toujours pas Unicode, et je tombe encore sur des outils qui prétendent faire de l'Unicode (par exemple UTF-8) mais qui émettent leur contenu dans une autre page de codes.

11 votes

@Tronic Je ne pense pas vraiment que "mieux" soit approprié dans ce cas. Cela dépend de l'environnement. Si vous êtes sûr que tous les fichiers UTF-8 sont marqués d'un BOM, alors vérifier le BOM est la façon "meilleure", car c'est plus rapide et plus fiable.

946voto

Martin Cote Points 12762

Le BOM UTF-8 est une séquence d'octets au début d'un flux de texte (0xEF, 0xBB, 0xBF) qui permet au lecteur de deviner de manière plus fiable qu'un fichier est encodé en UTF-8.

Normalement, le BOM est utilisé pour signaler l'endianness d'un encodage, mais comme l'endianness est sans importance pour l'UTF-8, le BOM est inutile.

Conformément à la norme Unicode, le BOM pour les fichiers UTF-8 n'est pas recommandé:

2.6 Systèmes de codage

... L'utilisation d'un BOM n'est ni requise ni recommandée pour l'UTF-8, mais peut être rencontrée dans des contextes où des données UTF-8 sont converties à partir d'autres formes d'encodage qui utilisent un BOM ou lorsque le BOM est utilisé comme une signature UTF-8. Consultez la sous-section "Marque d'ordre de bytes" dans Section 16.8, Caractères spéciaux pour plus d'informations.

146 votes

Il se peut que ce ne soit pas recommandé, mais d'après mon expérience dans les conversions en hébreu, le BOM est parfois crucial pour la reconnaissance en UTF-8 dans Excel, et peut faire la différence entre du charabia et de l'hébreu

46 votes

Il se peut que ce ne soit pas recommandé, mais cela a fait des merveilles pour mon script powershell en essayant de produire la sortie "æøå"

78 votes

Peu importe qu'il ne soit pas recommandé par la norme, c'est autorisé, et je préfère grandement avoir quelque chose agir en tant que signature UTF-8 plutôt que les alternatives de supposition ou de devinette. Le logiciel conforme à Unicode devrait / doit pouvoir gérer sa présence, donc j'encourage personnellement son utilisation.

291voto

paercebal Points 38526

Les autres excellentes réponses ont déjà répondu que :

  • Il n'y a pas de différence officielle entre UTF-8 et UTF-8 avec BOM
  • Une chaîne UTF-8 avec BOM commencera par les trois octets suivants. EF BB BF
  • Ces octets, s'ils sont présents, doivent être ignorés lors de l'extraction de la chaîne du fichier/flux.

Mais, en tant qu'information additionnelle à cela, le BOM pour UTF-8 pourrait être une bonne façon de "détecter" si une chaîne a été encodée en UTF-8... Ou cela pourrait être une chaîne légitime dans n'importe quel autre encodage...

Par exemple, les données [EF BB BF 41 42 43] pourraient être :

  • La chaîne légitime ISO-8859-1 "ABC"
  • La chaîne légitime UTF-8 "ABC"

Alors, même s'il peut être intéressant de reconnaître l'encodage du contenu d'un fichier en regardant les premiers octets, vous ne devriez pas vous fier à cela, comme le montre l'exemple ci-dessus

Les encodages devraient être connus, pas devinés.

3 votes

Désolé monsieur, mais je ne comprends pas très bien l'exemple que vous venez de donner. Si j'ai une chaîne [EF BB BF 41 42 43], comment pourrais-je l'interpréter? En utilisant ISO-8859-1 ou UTF-8? Parce que, tout comme votre exemple le disait, les deux donneront une chaîne légitime : "ABC" and "ABC".

68 votes

@Alcott : Vous avez compris correctement. La chaîne [EF BB BF 41 42 43] n'est qu'un tas d'octets. Vous avez besoin d'informations externes pour choisir comment l'interpréter. Si vous pensez que ces octets ont été encodés en utilisant ISO-8859-1, alors la chaîne est "ABC". Si vous pensez que ces octets ont été encodés en utilisant UTF-8, alors c'est "ABC". Si vous ne savez pas, alors vous devez essayer de trouver. Le BOM pourrait être un indice. L'absence de caractères invalides lors de la décodage en UTF-8 pourrait en être un autre... En fin de compte, à moins que vous puissiez mémoriser/trouver l'encodage d'une manière ou d'une autre, un tableau d'octets n'est qu'un tableau d'octets.

23 votes

@paercebal Alors que "" est valide en latin-1, il est très peu probable qu'un fichier texte commence par cette combinaison. Il en va de même pour les marqueurs ucs2-le/be ÿþ et þÿ. De plus, on ne peut jamais savoir.

159voto

J P Points 727

Il existe au moins trois problèmes associés au fait de mettre un BOM dans des fichiers encodés en UTF-8.

  1. Les fichiers qui ne contiennent pas de texte ne sont plus vides car ils contiennent toujours le BOM.
  2. Les fichiers qui contiennent du texte dans le sous-ensemble ASCII de l'UTF-8 ne sont plus eux-mêmes en ASCII car le BOM n'est pas en ASCII, ce qui provoque des dysfonctionnements dans certains outils existants, et il peut être impossible pour les utilisateurs de remplacer de tels outils obsolètes.
  3. Il n'est pas possible de concaténer plusieurs fichiers ensemble car chaque fichier a désormais un BOM au début.

Et, comme d'autres l'ont mentionné, il n'est ni suffisant ni nécessaire d'avoir un BOM pour détecter qu'un fichier est en UTF-8 :

  • Il n'est pas suffisant car une séquence arbitraire d'octets peut commencer par la séquence exacte qui constitue le BOM.
  • Il n'est pas nécessaire car vous pouvez simplement lire les octets comme s'ils étaient en UTF-8 ; si cela réussit, c'est, par définition, de l'UTF-8 valide.

5 votes

@cheers-and-hth-alf J'ai maintenant clarifié la déclaration ci-dessus; ce sont des faits, pas de logique impliquée.

0 votes

Après la modification des points 1 et 2, ces deux points ne sont plus contradictoires en soi. C'est une amélioration. Je discuterai chaque point à tour de rôle.

12 votes

Re point 1 "Les fichiers qui ne contiennent aucun texte ne sont plus vides car ils contiennent toujours le BOM", cela (1) confond le niveau du système de fichiers OS avec le niveau du contenu interprété, plus cela (2) suppose incorrectement qu'en utilisant le BOM on doit également mettre un BOM dans chaque fichier autrement vide. La solution pratique à (1) est de ne pas faire (2). Essentiellement, la plainte se résume à "il est possible de mettre de manière peu pratique un BOM dans un fichier par ailleurs vide, empêchant ainsi la détection la plus facile de fichier logiquement vide (en vérifiant la taille du fichier)". Malgré tout, un bon logiciel devrait pouvoir gérer cela, car il a un but.

52voto

dan04 Points 33306

Quelle est la différence entre UTF-8 et UTF-8 sans BOM?

Réponse courte : En UTF-8, un BOM est encodé sous forme des octets EF BB BF au début du fichier.

Réponse longue :

À l'origine, il était prévu que Unicode soit encodé en UTF-16/UCS-2. Le BOM a été conçu pour cette forme d'encodage. Lorsque vous avez des unités de code sur 2 octets, il est nécessaire d'indiquer l'ordre de ces deux octets, et une convention courante pour le faire est d'inclure le caractère U+FEFF en tant que "Marque d'ordre de byte" au début des données. Le caractère U+FFFE est définitivement non attribué afin que sa présence puisse être utilisée pour détecter le mauvais ordre de byte.

UTF-8 a le même ordre d'octets quel que soit le type de processeur, donc une marque d'ordre de byte n'est pas nécessaire. Cependant, elle peut apparaître (sous forme de séquence d'octets EF BB FF) dans des données qui ont été converties en UTF-8 à partir d'UTF-16, ou en tant que "signature" pour indiquer que les données sont en UTF-8.

Lequel est meilleur?

Sans. Comme l'a répondu Martin Cote, la norme Unicode ne le recommande pas. Cela pose problème pour les logiciels qui ne reconnaissent pas le BOM.

Une meilleure façon de détecter si un fichier est en UTF-8 est d'effectuer une vérification de validité. UTF-8 a des règles strictes sur les séquences d'octets qui sont valides, donc la probabilité d'un faux positif est négligeable. Si une séquence d'octets ressemble à de l'UTF-8, c'est probablement le cas.

8 votes

Cela invaliderait également l'UTF-8 valide avec un seul octet erroné, bien que :/

10 votes

-1 re "Cela provoque des problèmes avec les logiciels non conçus pour le BOM.", cela n'a jamais été un problème pour moi, au contraire, l'absence de BOM provoque des problèmes avec les logiciels conçus pour le BOM (en particulier Visual C++) a été un problème. Donc, cette déclaration est très spécifique à la plateforme, un point de vue étroit de l'univers Unix, mais est présentée de manière trompeuse comme si elle s'appliquait en général. Ce qui n'est pas le cas.

6 votes

Non, l'UTF-8 n'a pas de BOM. Cette réponse est incorrecte. Voir la norme Unicode.

38voto

Helen Craigman Points 399

L'UTF-8 avec BOM est mieux identifié. J'en suis arrivé à cette conclusion de manière difficile. Je travaille sur un projet où l'un des résultats est un fichier CSV, incluant des caractères Unicode.

Si le fichier CSV est enregistré sans BOM, Excel le considère comme un fichier ANSI et affiche n'importe quoi. Une fois que vous ajoutez "EF BB BF" au début (par exemple, en le ré-enregistrant en utilisant le Bloc-notes avec UTF-8; ou Notepad++ avec UTF-8 avec BOM), Excel l'ouvre correctement.

Préfixer le caractère BOM aux fichiers texte Unicode est recommandé par le RFC 3629 : "UTF-8, un format de transformation de l'ISO 10646", Novembre 2003 sur https://www.rfc-editor.org/rfc/rfc3629 (cette dernière information trouvée sur : http://www.herongyang.com/Unicode/Notepad-Byte-Order-Mark-BOM-FEFF-EFBBBF.html)

6 votes

Merci pour ce conseil excellent si l'on crée des fichiers UTF-8 destinés à être utilisés par Excel. Dans d'autres circonstances cependant, je suivrais toujours les autres réponses et sauterais le BOM.

5 votes

Il est également utile si vous créez des fichiers ne contenant que de l'ASCII et que vous pouvez ensuite y ajouter des caractères non-ASCII. Je viens de rencontrer un tel problème : un logiciel qui attend de l'UTF-8, crée un fichier avec des données à modifier par l'utilisateur. Si le fichier initial ne contient que de l'ASCII, est ouvert dans certains éditeurs, puis enregistré, il se retrouve en latin-1 et tout se casse. Si j'ajoute le BOM, il sera détecté comme UTF-8 par l'éditeur et tout fonctionnera.

1 votes

J'ai trouvé plusieurs outils liés à la programmation qui nécessitent le BOM pour reconnaître correctement les fichiers UTF-8. Visual Studio, SSMS, Sourcetree...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X