Question

Il semble qu'il y ait une ambiguïté entre le Byte Order Marks utilisé pour UTF16-LE et UTF-32LE. En particulier, pensez à un fichier qui contient les 8 octets suivants:

FF FE 00 00 00 00 00 00

Comment puis-je savoir si ce fichier contient:

  1. Le UTF16-LE BOM (FF FE) suivi de 3 caractères nuls; ou
  2. Le UTF32-LE BOM (FF FE 00 00) suivi d'un caractère nul?

Unicode BOM sont décrites ici: http://unicode.org/faq/utf_bom.html # bom4 mais il n'y a pas de discussion de cette ambiguïté. Est-ce que je manque quelque chose?

Était-ce utile?

La solution

Comme son nom l'indique, la nomenclature ne vous dit l'ordre des octets , pas l'encodage. Vous devez savoir ce que l'encodage est d'abord, vous pouvez utiliser la nomenclature pour déterminer si les octets les moins ou les plus significatifs sont d'abord pour les séquences multi-octets.

Un effet secondaire la chance de la nomenclature est que vous pouvez également utiliser parfois de deviner l'encodage si vous ne le savez pas, mais ce n'est pas ce qu'il a été conçu et il ne remplace pas l'envoi d'informations d'encodage approprié .

Autres conseils

Il est sans ambiguïté. FF FE est UTF-16LE et FF FE 00 00 indique UTF-32LE. Il n'y a aucune raison de penser que FF FE 00 00 est peut-être UTF-16LE parce que les FFU ont été conçus pour le texte, et les utilisateurs ne devrait pas utiliser des caractères NUL dans leur texte. Après tout, quand était la dernière fois que vous avez ouvert un éditeur hexadécimal et inséré quelques octets de 00 dans un document texte? ^ _ ^

Je l'ai connu le même problème comme Edward. Je suis d'accord avec Dustin, généralement on pas utiliser null-caractères dans les fichiers texte.

Cependant, j'ai créé un fichier contenant tous les caractères unicode. Je premier utilisé le codage UTF-32LE, puis un codage UTF-32BE, un utf-16LE et un codage UTF-16BE ainsi qu'un codage UTF-8.

Lors d'une tentative de ré-encoder les fichiers à utf-8, je voulais comparer le résultat au fichier utf-8 déjà existant. Parce que le premier caractère dans mes fichiers après la nomenclature est le nul caractère, je ne pu détecter avec succès le fichier avec la nomenclature de utf-16LE, il est apparu que la nomenclature de utf-32LE, parce que les octets sont apparus exactement comme Edward a décrit. Le premier caractère après la nomenclature FFFE est 0000, mais la détection de la nomenclature trouve une nomenclature FFFE0000 et ainsi, détecté utf-32LE au lieu de utf-16LE où mon premier 0000 caractères a été volé et pris dans le cadre de la nomenclature.

Donc on ne devrait jamais utiliser un nul caractère premier caractère d'un fichier codé avec utf-16 little endian, car il fera l'utf-16LE et utf-32LE nomenclature ambiguë.

Pour résoudre mon problème, je vais échanger le premier et le second caractère. : -)

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