c# Détecter l'encodage xml à partir du Tableau d'Octets?
Eh bien, j'ai un tableau d'octets, et je sais que je suis un xml serilized objet dans le tableau d'octets est-il possible de l'encodage à partir d'elle?
Im ne va pas deserilize, mais im en l'enregistrant dans un champ xml sur un serveur sql... donc j'ai besoin de convertir une chaîne de caractères?
- toute solution finale avec l'intégralité du code source de l'échantillon de travail à ce sujet ?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez consulter la première 40-ish octets1. Ils devrait contenir le document de déclaration (en supposant qu'il a un document de déclaration") qui doit contenir le codage ou vous pouvez supposer qu'il est en UTF-8 ou UTF-16, ce qui est évident à partir de la façon dont vous l'avez compris, le
<?xml
partie. (Il suffit de cocher pour les deux modèles.)De façon réaliste, vous attendez-vous que vous aurez jamais obtenir quoi que ce soit d'autre que UTF-8 ou UTF-16? Si pas, vous pouvez cocher la case pour les modèles que vous obtenez à la fois de ceux et de lever une exception si elle ne suit pas en soit le motif. Sinon, si vous voulez faire une autre tentative, vous pouvez toujours essayer de décoder le document en UTF-8, le ré-encoder et voir si vous obtenez le même octets de retour. Ce n'est pas idéal, mais c'est peut-travail.
Je suis sûr qu'il y a de plus rigoureux de façons de le faire, mais ils sont susceptibles d'être tatillons 🙂
1 Tout à fait peut-être moins que cela. Je figure 20 caractères devrait être suffisant, qui est de 40 octets en UTF-16.
Une solution similaire à cette question pourrait résoudre ce problème en utilisant un jet sur le tableau d'octets. Ensuite, vous n'aurez pas à jouer au niveau de l'octet. Comme ceci:
La première 2 ou 3 octets peut-être une Marque d'Ordre des Octets (BOM), qui peut vous dire si le flux est de l'UTF-8, Unicode-little-endian ou Unicode-gros-boutiste.
UTF-8 BOM est 0xEF 0xBB 0xBF
Unicode-gros-boutiste est 0xFE 0xFF
Unicode-LittleEndiaon est 0xFF 0xFE
Si aucune de ces sont présents, alors vous pouvez utiliser l'ASCII pour tester
<?xml
(note la plus moderne de la génération XML colle à la norme qu'aucun blanc ne peut précéder le xml déclarer).ASCII est utilisé jusqu'
?>
de sorte que vous pouvez trouver la présence de encoding= et trouver sa valeur.Si l'encodage n'est pas présent ou
<?xml
déclarer n'est pas présent, alors vous pouvez supposer UTF-8.La Spécification W3C XML a une section sur la façon de déterminer l'encodage d'une chaîne d'octets.
Vérifiez tout d'abord pour une Unicode Marque d'Ordre d'Octet
Une NOMENCLATURE est juste un autre caractère; c'est l':
Le caractère U+FEFF, ainsi que tous les autres caractères dans le fichier, est codé à l'aide du schéma de codage:
00 00 FE FF
: UCS-4, big-endian machine (1234 ordre)FF FE 00 00
: UCS-4, little-endian machine (4321 ordre)00 00 FF FE
: UCS-4, insolite octet de commande (2143)FE FF 00 00
: UCS-4, insolite octet de commande (3412)FE FF ## ##
: UTF-16, big-endianFF FE ## ##
: UTF-16, little-endianEF BB BF
: UTF-8où
## ##
peut être n'importe quoi - à l'exception de deux à zéroAfin de vérifier d'abord le premier octets pour l'une de ces signatures. Si vous trouvez l'un d'entre eux, le retour que code identificateur de page
Ou bien chercher <?xml
Si le document XML n'a pas de Marque d'Ordre des Octets de caractères, puis vous allez à la recherche pour les cinq premiers caractères de chaque document XML doit avoir:
Il est utile de savoir que
<
est #x0000003C?
est #x0000003FAvec qui nous avons assez de regarder les quatre premiers octets:
00 00 00 3C
: UCS-4, big-endian machine (1234 ordre)3C 00 00 00
: UCS-4, little-endian machine (4321 ordre)00 00 3C 00
: UCS-4, insolite octet de commande (2143)00 3C 00 00
: UCS-4, insolite octet de commande (3412)00 3C 00 3F
: UTF-16, big-endian3C 00 3F 00
: UTF-16, little-endian3C 3F 78 6D
: UTF-84C 6F A7 94
: certains saveur de EBCDICDe sorte que nous pouvons ajouter de plus à notre code: