895 votes

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

Quelle est la différence entre un UTF-8 et un UTF-8 sans un NOMENCLATURE ? Lequel est le meilleur ?

82 votes

L'UTF-8 est mieux détecté par le contenu que par la nomenclature. La méthode est simple : essayez de lire le fichier (ou une chaîne) en UTF-8 et si cela réussit, supposez que les données sont UTF-8. Sinon, supposez qu'il s'agit de CP1252 (ou d'un autre encodage 8 bits). Tout codage 8 bits non UTF-8 contiendra presque certainement des séquences qui ne sont pas autorisées par UTF-8. L'ASCII pur (7 bits) est interprété comme UTF-8, mais le résultat est correct de cette façon aussi.

42 votes

La recherche du contenu UTF-8 dans des fichiers volumineux prend du temps. Une nomenclature rend ce processus beaucoup plus rapide. En pratique, vous devez souvent faire les deux. Le coupable aujourd'hui est qu'une grande partie du contenu textuel n'est pas Unicode, et je rencontre encore des outils qui disent faire de l'Unicode (par exemple UTF-8) mais qui émettent leur contenu dans une autre page de code.

11 votes

@Tronic Je ne pense pas vraiment que "mieux" convient 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 signe NOMENCLATURE que de vérifier le NOMENCLATURE est le "mieux" parce qu'elle est plus rapide et plus fiable.

849voto

Martin Cote Points 12762

La nomenclature UTF-8 est une séquence de 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 NOMENCLATURE est utilisé pour signaler le endiveté d'un encodage, mais comme l'endianness n'est pas pertinent pour UTF-8, le BOM est inutile.

Selon le Norme Unicode le La nomenclature pour les fichiers UTF-8 n'est pas recommandée. :

2.6 Schémas de codage

... L'utilisation d'une BOM n'est ni requise ni recommandée pour UTF-8, mais peut être rencontrée dans des contextes où les données UTF-8 sont converties à partir d'autres formes de codage qui utilisent une BOM ou lorsque la BOM est utilisée comme signature UTF-8. Voir la sous-section "Marque d'ordre des octets" dans le document Section 16.8, Spéciaux pour plus d'informations.

128 votes

Ce n'est peut-être pas recommandé, mais d'après mon expérience des conversions en hébreu, la nomenclature est parfois cruciale pour la reconnaissance UTF-8 dans Excel, et peut faire la différence entre le jibrish et l'hébreu.

33 votes

Ce n'est peut-être pas recommandé mais cela a fait des merveilles à mon script de powershell en essayant de sortir "æøå".

70 votes

Même si ce n'est pas recommandé par la norme, c'est autorisé, et je préfère de loin avoir quelque chose pour agir comme une signature UTF-8 plutôt que les alternatives de supposer ou de deviner. Les logiciels compatibles avec Unicode devraient/doivent être capables de gérer sa présence, et j'encourage donc personnellement son utilisation.

257voto

paercebal Points 38526

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

  • Il n'y a pas de différence officielle entre UTF-8 et BOM-ed UTF-8.
  • Une chaîne UTF-8 en nomenclature 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 de caractères du fichier/du flux.

Mais, à titre d'information complémentaire, le BOM pour UTF-8 pourrait être un bon moyen de "sentir" si une chaîne a été encodée en UTF-8... Ou bien il pourrait s'agir d'une chaîne légitime dans tout autre encodage...

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

Ainsi, bien qu'il puisse être intéressant de reconnaître l'encodage du contenu d'un fichier en regardant les premiers octets, vous ne devez pas vous fier à cela, comme le montre l'exemple ci-dessus.

Les codages doivent être connus, et non devinés.

3 votes

Désolé monsieur, mais je ne comprends pas bien l'exemple que vous venez de donner. Si je reçois une chaîne de caractères [EF BB BF 41 42 43], comment puis-je l'interpréter ? En utilisant ISO-8859-1 ou UTF-8 ? Parce que, comme le dit votre exemple, les deux donnent une chaîne légitime : "ï "¿ABC" et "ABC".

64 votes

@Alcott : Vous avez bien compris. La chaîne [EF BB BF 41 42 43] est juste un tas d'octets. Vous avez besoin d'informations externes pour choisir comment l'interpréter. Si vous pensez que ces octets ont été codés en utilisant la norme ISO-8859-1, alors la chaîne est "ï "¿ABC". Si vous pensez que ces octets ont été codés en UTF-8, alors la chaîne est "ABC". Si vous ne le savez pas, vous devez essayer de le découvrir. La nomenclature peut être un indice. L'absence de caractère invalide lorsqu'il est décodé 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 est juste un tableau d'octets.

22 votes

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

143voto

J P Points 727

L'insertion d'une nomenclature dans les fichiers codés en UTF-8 pose au moins trois problèmes.

  1. Les fichiers qui ne contiennent aucun texte ne sont plus vides car ils contiennent toujours la nomenclature.
  2. Les fichiers contenant du texte qui se trouve dans le sous-ensemble ASCII d'UTF-8 ne sont plus eux-mêmes ASCII parce que la nomenclature n'est pas ASCII, ce qui fait que certains outils existants tombent en panne et qu'il peut être impossible pour les utilisateurs de remplacer ces anciens outils.
  3. Il n'est pas possible de concaténer plusieurs fichiers ensemble car chaque fichier a maintenant une nomenclature au début.

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

  • Elle n'est pas suffisante parce qu'il peut arriver qu'une séquence d'octets arbitraire commence par la séquence exacte qui constitue la nomenclature.
  • Ce n'est pas nécessaire car vous pouvez simplement lire les octets comme s'ils étaient UTF-8 ; si cela réussit, il s'agit, par définition, d'un UTF-8 valide.

5 votes

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

0 votes

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

8 votes

Concernant le point 1 "Les fichiers qui ne contiennent pas de texte ne sont plus vides parce qu'ils contiennent toujours la nomenclature", ceci (1) confond le niveau du système de fichiers du système d'exploitation avec le niveau du contenu interprété, et (2) suppose à tort qu'en utilisant la nomenclature, on doit mettre une nomenclature dans chaque fichier autrement vide. La solution pratique à (1) est de ne pas faire (2). Essentiellement, la plainte se réduit à "il est possible de mettre une nomenclature dans un fichier vide, ce qui empêche la détection la plus facile d'un fichier logiquement vide (en vérifiant la taille du fichier)". Un bon logiciel devrait tout de même être capable de gérer ce problème, puisqu'il a un but.

52voto

dan04 Points 33306

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

Réponse courte : En UTF-8, une nomenclature est encodée sous la forme des octets suivants EF BB BF au début du fichier.

Longue réponse :

À l'origine, il était prévu que Unicode serait codé en UTF-16/UCS-2. La nomenclature a été conçue pour cette forme d'encodage. Lorsque vous avez des unités de code de 2 octets, il est nécessaire d'indiquer dans quel ordre se trouvent ces deux octets, et une convention courante pour ce faire consiste à inclure le caractère U+FEFF comme "marque d'ordre d'octet" au début des données. Le caractère U+FFFE n'est pas attribué de façon permanente, de sorte que sa présence peut être utilisée pour détecter l'ordre incorrect des octets.

UTF-8 a le même ordre d'octet indépendamment de l'endiannage de la plate-forme, donc une marque d'ordre d'octet n'est pas nécessaire. Cependant, cela peut arriver (comme la séquence d'octets EF BB FF ) dans les données qui ont été converties en UTF-8 à partir d'UTF-16, ou comme "signature" pour indiquer que les données sont UTF-8.

Lequel est le meilleur ?

Sans. Comme l'a répondu Martin Cote, la norme Unicode ne le recommande pas. Cela pose des problèmes avec les logiciels qui ne tiennent pas compte de la nomenclature.

Une meilleure façon de détecter si un fichier est UTF-8 est d'effectuer un contrôle de validité. UTF-8 a des règles strictes concernant les séquences d'octets valides, la probabilité d'un faux positif est donc négligeable. Si une séquence d'octets ressemble à UTF-8, elle l'est probablement.

8 votes

Cela invaliderait également les UTF-8 valides contenant un seul octet erroné, mais :/

8 votes

-1 re " Cela pose des problèmes avec les logiciels non compatibles avec la nomenclature ", cela n'a jamais été un problème pour moi, mais au contraire, le fait que l'absence de nomenclature pose des problèmes avec les logiciels compatibles avec la nomenclature (en particulier Visual C++) a été un problème. Cette affirmation est donc très spécifique à la plate-forme L'objectif de ce document est de donner un point de vue étroit sur Unix, mais il est présenté de manière trompeuse comme s'il s'appliquait de manière générale. Ce qui n'est pas le cas.

6 votes

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

34voto

Helen Craigman Points 399

UTF-8 avec BOM est mieux identifié. Je suis arrivé à cette conclusion de la manière la plus dure. Je travaille sur un projet dont l'un des résultats est un fichier CSV y compris les caractères Unicode.

Si le fichier CSV est enregistré sans nomenclature, Excel pense qu'il s'agit d'un fichier ANSI et affiche du charabia. Une fois que vous avez ajouté "EF BB BF" au début (par exemple, en le réenregistrant en utilisant Notepad avec UTF-8 ; ou Notepad++ avec UTF-8 et nomenclature), Excel l'ouvre correctement.

L'ajout du caractère BOM dans les fichiers texte Unicode est recommandé par la RFC 3629 : "UTF-8, a transformation format of ISO 10646", novembre 2003. à l'adresse http://tools.ietf.org/html/rfc3629 (cette dernière information a été trouvée à l'adresse suivante http://www.herongyang.com/Unicode/Notepad-Byte-Order-Mark-BOM-FEFF-EFBBBF.html )

6 votes

Merci pour cet excellent conseil en cas de création de fichiers UTF-8 destinés à être utilisés par Excel. Dans d'autres circonstances, cependant, je suivrais les autres réponses et ne tiendrais pas compte de la nomenclature.

5 votes

Il est également utile si vous créez des fichiers qui ne contiennent que de l'ASCII et auxquels on peut ajouter ultérieurement du non-ascii. Je viens de rencontrer un tel problème : un logiciel qui s'attend à utf8, crée un fichier avec certaines données à éditer par l'utilisateur. Si le fichier initial ne contient que de l'ASCII, qu'il est ouvert dans certains éditeurs puis enregistré, il se retrouve en latin-1 et tout se casse la figure. Si j'ajoute la nomenclature, elle sera détectée comme UTF8 par l'éditeur et tout fonctionne.

1 votes

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

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