web-dev-qa-db-fra.com

Quelle est l'utilisation du "codage" dans l'en-tête XML?

En regardant l'en-tête XML

<?xml version="1.0" encoding="UTF-16" standalone="no"?>

Ai-je raison de dire que l'attribut encoding est 

  • venir trop tard (vous ne pouvez pas le lire correctement à moins de connaître le codage ...)
  • redondant, donc source d'erreurs: il est trop facile de le remplacer par "Big5" tout en sauvegardant le fichier en UTF-8

Ou bien cet attribut ne concerne-t-il pas le contenu du flux?

Est-ce que je mélange les choses ici? 

41
xtofl

Comme vous l'avez mentionné, vous devez connaître l'encodage du fichier pour lire l'attribut encoding.

Cependant, il existe une heuristique qui peut facilement vous rapprocher du codage "réel" pour vous permettre de lire l'attribut de codage. Cela fonctionne car, par définition, la partie <?xml ne peut contenir que des caractères compris dans la plage ASCII (quel qu’en soit le code).

Le standard XML même décrit le processus exact utilisé pour trouver le codage .

Et l'étiquette de codage n'est pas redondante non plus. Par exemple, si vous utilisez l'algorithme de la spécification XML pour savoir que certains codages basés sur ASCII (ou compatibles avec ASCII) sont utilisés, vous _ deveztoujours lire le codage afin de déterminer celui qui est réellement utilisé. (les candidats valides seraient ASCII, UTF-8, l’un des encodages ISO-8859- * , l’un des encodages Windows- * , KOI8-R et bien d’autres encore) . Pour la partie <?xml elle-même, cela ne fera aucune différence, mais pour le reste du document, cela peut faire une énorme différence.

En ce qui concerne les fichiers XML mal étiquetés: oui, il est facile de les produire, cependant: la spécification XML spécifie clairement que ces fichiers sont mal formés et en tant que tels ne sont pas du code XML correct. Les encodages incorrects doivent être signalés comme une erreur (tant qu'ils peuvent être détectés!). C'est donc le problème de quiconque produit le XML.

41
Joachim Sauer

Vous avez tout à fait raison, cela ressemble à une conception étrange. Cela ne fonctionne que parce que la déclaration XML utilise uniquement des caractères ASCII et que presque tous les codages sont des sur-ensembles d'ASCII. Si vous êtes prêt à accepter quelque chose qui ne l'est pas, par exemple EBCDIC, vous pouvez vérifier si le fichier commence par la représentation EBCDIC de "<?xml". Ce qui signifie que vous vous basez sur le niveau général de redondance dans l'en-tête du fichier, plutôt que sur l'attribut de codage lui-même. Comme beaucoup de choses dans XML, c'est pragmatique et fonctionne, mais n'est pas particulièrement élégant.

6
Michael Kay

Les analyseurs syntaxiques XML doivent uniquement prendre en charge au moins UTF-8 et UTF-16. L'analyseur XML commence par essayer les codages basés sur la marque de nom d'octet (BOM), le cas échéant (pour UTF-16, UTF-32 et même UTF-8 avec la nomenclature fictive). Si aucun n'est trouvé, alors l'analyseur utilisera les codages UTF-32, UTF-16, UTF-8, ASCII et autres codage à un seul octet compatibles ASCII. Ce n'est qu'alors qu'il verra l'attribut de codage et redémarrera l'analyse si nécessaire.

2
Delan Azabani

En principe, je pense que vous avez peut-être raison de dire que l'instruction encoding est 'en retard' dans le fichier. Cependant, la première ligne entière utilise uniquement des caractères de base. Autant que je sache, ceux-ci sont les mêmes dans presque tous les encodages, donc quel que soit le décodage utilisé, il va lire <?xml ... ?> de toute façon.

Tout ce qui vient après cela peut toutefois avoir de l'importance. Par exemple, le texte d'une section CDATA peut être codé en cyrillique.

0
Zsub