Question

Sont-ils obsolètes? Ils semblent être la pire idée de tous les temps - incorporer quelque chose dans le contenu de votre fichier que personne ne puisse voir, mais ayant un impact sur la fonctionnalité du fichier. Je ne comprends pas pourquoi j'en voudrais un.

Était-ce utile?

La solution

Ils sont nécessaires dans certains cas, oui, car il existe à la fois des implémentations UTF-16 en version Small-Endian et Big-Endian.

Lors de la lecture d’un fichier UTF-16 inconnu, comment savoir lequel des deux est utilisé? La seule solution consiste à placer dans le fichier une sorte de marqueur facilement identifiable, qui ne peut jamais être confondu avec autre chose, quelle que soit la finalité utilisée.

C'est ce que fait la nomenclature.

Et en avez-vous besoin? Ce n'est que si vous 1) utilisez un codage UTF où l'endianité est un problème (c'est important pour UTF-16, mais UTF8 est toujours identique, quel que soit l'endianité), et le fichier va être partagé. avec des applications externes.

Si votre propre application est la seule à pouvoir lire et écrire le fichier, vous pouvez omettre la nomenclature et simplement décider une fois pour toutes quelle endianité vous allez utiliser. Mais si une autre application doit lire le fichier, elle ne connaîtra pas l’endianisme à l’avance. Il peut donc être judicieux d’ajouter la nomenclature.

Autres conseils

Certains extraits de la FAQ UTF et BOM du consortium Unicode peuvent être utiles.

  

Q: Qu'est-ce qu'une nomenclature?

     

A: Une marque d'ordre d'octet (BOM) est constituée du code de caractère U + FEFF au début d'un flux de données , où elle peut être utilisée comme signature. définir l'ordre des octets et la forme d'encodage, principalement des fichiers en texte brut non marqués. Sous certains protocoles de niveau supérieur, l'utilisation d'une nomenclature peut être obligatoire (ou interdite) dans le flux de données Unicode défini dans ce protocole. (Souligne moi.)

Je ne dirais pas exactement que la marque d'ordre des octets est incorporée dans les données. Au contraire, il préfixe les données. Le caractère n'est qu'une marque d'ordre des octets lorsqu'il est la première chose dans le flux de données. Partout ailleurs, il s'agit de l'espace insécable de largeur zéro . Les programmes compatibles Unicode qui n'honorent pas la marque d'ordre d'octets ne sont pas vraiment affectés par sa présence, car le caractère est invisible, et un menuisier au début d'un bloc de texte ne fait que joindre le caractère suivant à rien, il n'a donc aucun effet.

  

Q: Où une nomenclature est-elle utile?

     

A: Une nomenclature est utile au début des fichiers tapés sous forme de texte, mais pour lesquels on ne sait pas s'ils sont au format big ou little endian & # 8212; peut également servir d'indice indiquant que le fichier est au format Unicode, par opposition à un codage traditionnel, et sert en outre de signature pour le formulaire de codage spécifique utilisé.

Ainsi, vous voudriez une nomenclature lorsque votre programme est capable de gérer plusieurs codages Unicode. Sinon, comment votre programme saura-t-il quel encodage utiliser pour interpréter ses entrées?

  

Q: Quand une nomenclature est utilisée, s'agit-il uniquement de texte Unicode 16 bits?

     

A: Non, une nomenclature peut être utilisée comme signature, quelle que soit la transformation du texte Unicode: UTF-16, UTF-8, UTF-7, etc. La nomenclature correspond à la conversion du caractère Unicode U + FEFF par ce format de transformation. Sous cette forme, la nomenclature sert à indiquer à la fois qu’il s’agit d’un fichier Unicode et à l’un des formats dans lequel il se trouve.

C'est probablement le cas où la nomenclature est utilisée le plus fréquemment aujourd'hui. Il distingue le texte codé en UTF-8 de tout autre codage; ce n'est pas vraiment marquer l'ordre des octets puisque UTF-8 n'a qu'un ordre.

Si vous concevez votre propre protocole ou format de données, vous n'êtes pas obligé d'utiliser une nomenclature. Une autre question de la FAQ aborde ce sujet:

  

Q: Comment puis-je baliser des données qui n'interprètent pas U + FEFF comme une nomenclature?

     

A: Utilisez la balise UTF-16BE pour indiquer du texte UTF-16 big-endian et UTF-16LE pour indiquer du texte UTF-16 little-endian. Si vous utilisez une nomenclature, identifiez simplement le texte au format UTF-16.

Il mentionne le concept de baliser le format de vos données. Cela signifie qu’il faut spécifier le format hors bande à partir des données elles-mêmes. C’est formidable si une telle installation est disponible, mais ce n’est souvent pas le cas, en particulier lorsque des systèmes plus anciens sont mis à niveau pour Unicode.

La nomenclature indique le codage du fichier Unicode dans lequel se trouve le fichier. Sans cette distinction, un lecteur Unicode ne saurait pas lire le fichier.

Cependant, UTF-8 ne nécessite pas de nomenclature.

Consultez l'article dans Wikipedia .

Lorsque vous avez identifié UTF-8, vous n’avez pas besoin d’une nomenclature. Les marques d'ordre Byto ne sont utiles que pour UTF-16 et UTF-32 car elles indiquent à l'ordinateur si le fichier est au format Big Endian ou Little Endian . Certains éditeurs de texte peuvent utiliser la marque d'ordre des octets pour décider du codage utilisé par le document, mais cela ne fait pas partie du standard Unicode.

La " BOM " est un héritage des premiers jours d'Unicode quand il était supposé qu'utiliser Unicode signifierait utiliser des caractères 16 bits. C'est totalement inutile dans un encodage comme UTF-8 qui n'a qu'un ordre d'octets. Le choix de U + FEFF est également sous-optimal pour UTF-32, car il ne permet pas de distinguer tous les ordres d'octets possibles pour le milieu de gamme (pour cela, il faudrait une nomenclature codée avec 4 différents octets).

La seule raison pour laquelle vous en utiliseriez un est lorsque vous envoyez des données UTF-16 ou UTF-32 entre plates-formes avec des ordres d'octets différents, mais (1) la plupart des gens utilisent quand même UTF-8 et (2) le MIME charset paramètre fournit un meilleur mécanisme.

UTF16 et UTF32 peuvent être écrits à la fois en Big-Endian et en Little-Endian. Vous pouvez essayer de déterminer de manière heuristique l’endianess en analysant le résultat du traitement du fichier dans l’un ou l’autre endianess, mais pour vous épargner tout ce que vous en faites, la nomenclature peut vous dire tout de suite.

UTF-8 n'a pas vraiment besoin d'une nomenclature, car vous la décodez octet par octet.

Que vous les utilisiez vous-même lors de la création de fichiers texte, il est probablement utile de savoir quand vous lisez des fichiers texte. c'est-à-dire détecter et ignorer (et idéalement gérer en conséquence) la nomenclature au début du fichier. J'en ai rencontré quelques-uns qui l'avaient créé et qui m'avaient causé quelques problèmes au départ, jusqu'à ce que je sache ce qui se passait.

Les nomenclatures UTF16 et UTF32 indiquant si le contenu est au format Big-Endian ou Little-Endian et qu’il est au format Unicode, la nomenclature UTF-8 le classe comme encodé en utf-8. Sans la nomenclature UTF-8, comment savoir s'il s'agit d'un fichier ANSI ou d'un fichier encodé UTF-8? Bien entendu, la nomenclature UTF-8 n’indique pas à l’utilisateur final, car utf-8 est toujours un flux d’octets, mais indique si le contenu est au format Unicode ou ANSI encodé en utf-8. Bien sûr, vous pouvez rechercher des séquences valides d'utf-8, mais à mon avis, il est plus facile de vérifier les trois premiers octets du fichier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top