Alternative analyseur XML pour ElementTree à l'aise UTF-8 malheurs?
Je suis de parser du XML avec le elementtree.parse() de la fonction. Il fonctionne, sauf pour certains caractères utf-8(octet caractère au-dessus de 128). Je vois que la valeur par défaut de l'analyseur XMLTreeBuilder qui est basé sur les expatriés.
Est-il une alternative analyseur que je peux utiliser qui peuvent être moins strictes et permettent de caractères utf-8?
C'est l'erreur que j'obtiens avec la valeur par défaut de l'analyseur:
ExpatError: not well-formed (invalid token): line 311, column 190
Le personnage à l'origine de ce est un seul octet x92 (en hexadécimal). Je ne suis pas certain c'est même valable de caractères utf-8. Mais il serait agréable à manipuler parce que la plupart des éditeurs de texte afficher ce que: í
MODIFIER: Le contexte du personnage est: ne peut pas , où je suppose que c'est censé être une fantaisie apostraphe, mais dans l'éditeur hexadécimal, la même séquence est: 63 61 6E 92 74
OriginalL'auteur Kekoa | 2009-07-16
Vous devez vous connecter pour publier un commentaire.
Je vais commencer à partir de la question: "Est-il une alternative analyseur que je peux utiliser qui peuvent être moins strictes et permettent de caractères utf-8?"
Tous les parseurs XML acceptera les données sont codées en UTF-8. En fait, UTF-8 est le codage par défaut.
Un document XML peut commencer par une déclaration comme ceci:
ou comme ceci:
<?xml version="1.0"?>
ou de ne pas avoir une déclaration à tous les ... dans chaque cas, l'analyseur va décoder le document en UTF-8.
Cependant, vos données ne sont PAS encodés en UTF-8 ... c'est probablement Windows-1252 aka cp1252.
Si l'encodage n'est pas de l'UTF-8, soit le créateur doit inclure une déclaration (ou le bénéficiaire peut le faire précéder de l'un) ou le destinataire peut transcoder les données en UTF-8. La suite des vitrines de ce qui fonctionne et ce qui ne fonctionne pas:
OriginalL'auteur John Machin
Il semble que vous avez CP1252 texte. Si oui, il doit être spécifié en haut du fichier, par exemple.:
Cela ne fonctionne pas avec le ElementTree.
Si vous êtes à la création de ces fichiers vous-même, ne pas écrire dans ce codage. Les enregistrer en UTF-8 et de faire votre part pour aider à tuer obsolètes encodages de texte.
Si vous recevez CP1252 de données avec l'encodage de la spécification, et vous savez pour sûr qu'il va toujours être CP1252, vous pouvez simplement convertir en UTF-8 avant de l'envoyer à l'analyseur:
Votre question est brouillé: vous avez dit que le texte est "pas", qui est une petite lettre que j'ai aigu (u2019). Je traite avec assez inconnu langues étrangères sur une base régulière, que j'interprète comme l'a écrit. Merci de résoudre la question. La réponse est la même; il suffit de remplacer CP852 pour CP1252. Par la voie, 0x92 en CP1252 n'est pas une apostrophe, c'est un droit unique de candidature. Je ne devrais pas être étonné de voir que certains logiciels est cassé assez pour obtenir apostrophes mal. (Pas de votre faute--la faute de ce logiciel disponible en sortie d'une chaîne.)
Maynard: (1) la Reproduction des textes non-ASCII par un OP est souvent déformé. Ce que vous voyez n'est pas toujours ce qu'ils ont. the_raw_bytes.repr() est leur ami et le vôtre. Son "apostraphe" était un indice vital (2) "petite lettre que j'ai aigu (u2019)": hein? Selon la Norme Unicode U+2019 est en DROIT de guillemet SIMPLE qui lorsqu'ils sont encodés en cp1252 est 0x92 (3) les responsables de La aurait cassé le logiciel doit avoir été la lecture de la Norme Unicode sur U+2019: "c'est le préféré de caractères à utiliser pour l'apostrophe". (4) cp852? Son 0x92 -> PETITE LETTRE L (apl-je pas les yeux) AIGUË
Je dois souligner que si le Standard Unicode dit que le caractère préféré pour l'apostrophe est une fin de la citation, le Standard Unicode est faux. Qui viole le sens commun dans de nombreux, de manière évidente, et je peux vous garantir que 0x27 apostrophe restera la représentation correcte de l'apostrophe.
Désolé il n'était pas clair, mais le texte est vraiment: 63 61 6E 92 74 , peu importe à quoi il ressemble dans un éditeur.
OriginalL'auteur Glenn Maynard
Octet 0x92 n'est jamais valide que le premier octet de caractères UTF-8. Il peut être valable que subséquente d'un octet, cependant. Voir cette UTF-8 guide de l' pour une table de valide les séquences d'octets.
Pourriez-vous nous donner une idée de ce que les octets sont autour de 0x92? La déclaration XML comprennent un codage de caractères?
OriginalL'auteur Jon Skeet
Ah. Qui est "je", évidemment, et en effet, 0x92 est une apostrophe dans de nombreuses Fenêtres pages de code. Votre éditeur suppose au contraire que c'est un Mac fichier. 😉
Si c'est un one-off, fixer le fichier est la bonne chose à faire. Mais presque toujours, si vous avez besoin d'importer d'autres peuples XML, il y a beaucoup de choses qui ne sont tout simplement pas d'accord avec l'énoncé de l'encodage. J'ai trouvé que la meilleure solution est de les décoder avec erreur lors de la définition de "xmlcharrefreplace', et dans les cas graves, faire votre propre coutume de remplacement de caractères qui résout les problèmes les plus courants pour ce client particulier.
Je vais vous recommandons également lxml comme bibliothèque XML en Python, mais ce n'est pas le problème ici.
OriginalL'auteur Lennart Regebro