Selon cette réponse: Urllib2 Lire à Unicode EM > Je dois obtenir le type de contenu pour pouvoir passer à Unicode. Cependant, certains sites Web n'ont pas de "charset". P> par exemple, le ["Type de contenu"] pour Cette page est" Texte / HTML ". Je ne peux pas le convertir en Unicode. P> existe un "codage" par défaut (anglais, bien sûr) ... de sorte que si rien n'est trouvé, je peux juste Utilisez cela? P> P>
4 Réponses :
ou vous pouvez écrire la fonction de décodage de force comme ceci: p> htmlsource = htmlsource.decode ("utf8") code> doit fonctionner pour la plupart des cas, sauf que vous écrasez des sites d'encodage non anglais.
cp1252 code> et
utf16 code> décodera avec succès toute séquence d'octets i>, donc une de celles-ci devraient aller à la fin. (Je suggère
CP1252 CODE>; UTF-16 n'est pas largement utilisé sur le Web car il existe des problèmes de navigateur ainsi que d'être généralement inefficaces.)
Thx, je l'ai déplacé à la fin. Et oui utf16 n'est pas largement utilisé, mais dans ma langue UTF8 prend 3 octets, mais UTF16 n'a pris que 2 octets que nous l'utilisons pour des fichiers nominaux ou CSV, et Microsoft Excel ne semble pas bon avec les fichiers CSV codés UTF8.
@bobince: Désolé de dire, votre première Sentencence n'est pas correcte. Vous pensez peut-être que ISO-8859-1 aka latin1, qui a cette propriété (tout comme tout autre kit monocyclique qui définit tous les points de code). CP1252 ne définit pas 5 valeurs d'octets par ex. '\ x81' code>. UTF-16 fera Bork sur une seule substitution solitaire, et sur une substitution élevée non suivie d'une faible substitution.
THX JOHN, Ça a du sens, UTF16 pourrait fonctionner à partir de 0-FFFF, déplacé à la fin, mais une seule chose me vient à l'esprit, qu'est-ce que ce sera ce codage "\ xff \ xff \ 81"? juste fabriqué un?
@ S.Mark: "Travail" ne signifie pas "n'a pas soulevé une exception". Si vous demandez à quel codage que la séquence de 3 octets serait valide, la réponse est évidemment ISO-8859-1 (ou tout autre codage pour lequel tous les points sont définis); Si vous ajoutez le cavalier que la séquence doit être pratique et significative, cela coupe ISO-8859-1 car \ X80 à \ x9f Les deux inclusives sont des caractères de contrôle non utiles. Pourquoi demandez-vous?
@John, désolé, ma question n'était pas claire, je voulais dire utf16 besoin de 2 octets pour le décoder, mais si la taille totale est de 3 octets comme celui-ci "\ xff \ xff \ x81", le décodage obtiendra une exception ou ne jette pas, désolé pour vous dérouter avec une question non liée. Merci
@ S.Mark: "Le décodage obtiendra une exception ou ne jette pas" - Bien sûr, il n'y a pas d'autres alternatives. Si vous voulez demander ce qui va se passer si une tentative est faite de décoder une chaîne de taille étrange avec UTF16XE, bien sûr, cela jette une exception (que vous pourriez découvrir pour vous-même). Je ne suis pas confus; Vous auriez besoin de travailler plus fort que cela :-)
Y a-t-il un "codage" par défaut (anglais, bien sûr) ... de sorte que si rien ne soit trouvé, je peux simplement l'utiliser? p> blockQuote>
Non, il n'y a pas. Vous devez deviner. P>
Approche triviale: essayez de décoder comme
utf-8 code>. Si cela fonctionne, c'est bien, c'est probablement utf-8. Si ce n'est pas le cas, choisissez un codage le plus probable pour les types de pages que vous parcourez. Pour les pages anglaises
CP1252 CODE>, le codage européen de Windows Western Europe. (Qui est comme ISO-8859-1; en fait, la plupart des navigateurs utiliseront
CP1252 CODE> au lieu de
ISO-8859-1 CODE> Même si vous spécifiez que Charset, il vaut donc la peine de faire dupliquer que comportement.) p>
Si vous avez besoin de deviner d'autres langues, il devient très velu. Il existe des modules existants pour vous aider à deviner dans ces situations. Voir par exemple. Chardet . P>
Puis-je simplement faire: htmlsource = htmlsource.decode ('utf8') ... pour tout?
http a un encodage par défaut, voir le RFC w3.org/protocols /RFC2616/RFC2616-SEC3.html#sec3.7.1
Aaarrrgghhh Check out l'URL, il a un chariage; Lisez le message d'erreur, le code indique la fonction Unicode () FFS
@WDS: Techniquement oui, mais rien dans le monde n'obéit que la règle. :-(
Le charial par défaut est ISO-8859-1. Voir RFC2616, sections 3.7.1 et 3.4.1
@WDS et Denis: Les spécifications clash ici, car XML a un codage standard de UTF-8, si rien n'est fourni. Ceci est un problème connu (connu des auteurs de spécifications, c'est-à-dire).
Standard "de facto" pour HTTP est UTF-8.
RFC 2616 spécifié ISO-8859-1 uniquement pour les en-têtes, pas de contenu corporel. Et tandis que UTF-8 est de plus en plus populaire (et le seul sens sensible), il est peu probable une page dont l'encodage que vous devez deviner (c'est-à-dire l'un sans Charset code> ou fausse bom) sera UTF-8 . Les pages sans encodage sont généralement écrites dans le code de code Windows Windows de l'auteur (code> CP1252 code> et al comme ci-dessus.
RFC 7231 obsolète l'ancienne ISO-8859-1 par défaut. Outils.ietf.org/html/rfc7231#appendix-b
@bobince "RFC 2616 spécifié ISO-8859-1 uniquement pour les en-têtes, pas de contenu corporel." Cet obsolète RFC affirme le contraire: "Lorsque aucun paramètre de caractères explicite n'est fourni par l'expéditeur, les sous-types de supports du type" texte "sont définis pour avoir une valeur de caractères par défaut de" ISO-8859-1 "lorsqu'il est reçu via http." w3.org/protocols/rfc2616/rfc2616-sec3.html# Sec3.7.1
S'il n'y a pas de type de contenu explicite, il devrait être ISO-8859-1 comme indiqué précédemment dans les réponses. Malheureusement, ce n'est pas toujours le cas, c'est pourquoi les développeurs de navigateurs ont passé un certain temps à obtenir des algorithmes qui essaient de deviner le type de contenu en fonction du contenu de votre page. P>
Heureusement pour vous, Mark Pilgrim a fait tout le travail acharné sur le portage de la mise en œuvre de Firefox à Python, sous la forme du Module Chardet . Son Introduction sur la façon dont cela fonctionne pour l'un des chapitres de plongée dans Python em> 3 est aussi vaut la peine de lire. p>
Eh bien, je viens de parcourir l'URL donnée, qui redirige vers puis frapper ctrl kbd> + u kbd> (Voir la source) Firefox et il montre p> @konrad: que voulez-vous dire "semble comme si ... utilise ISO-8859-1" ?? P> @ Alex: Qu'est-ce qui vous fait penser qu'il n'a pas de "charset" ?? p> Regardez le code que vous avez (que nous devinez em> est la ligne qui cause l'erreur (s'il vous plaît Toujours montrer le message complet em> message d'erreur!)): p> et le message d'erreur: p> Cela signifie que Je suggère d'utiliser un autre nom pour cette variable - dites utilisez_unicode. P> Plus Suggestions: (1) Montrez toujours suffisamment de code pour reproduire l'erreur (2) Lisez toujours le message d'erreur. P> P> Unicode code> ne se réfère pas à la fonction intégrée, il fait référence à un
int code>. Je me souviens que dans votre autre question, vous avez eu quelque chose comme p>
+1 belle trouvaille, je n'ai pas réalisé qu'il remplace la fonction Unicode intégrée
J'ai mis à jour mon commentaire, si vous aimez utiliser une fonction de décodage tout le temps.
Aaarrrgghhh Check out l'URL, il a un chariage; Lisez le message d'erreur, le code indique la fonction Unicode () FFS
il h! Et aucun de nous ne l'a repéré!
@bobince: Ouais, alors besoin d'un bouton "J'étais faux" afin que vous puissiez vous rendre de vos points mal acquis, mais laissez votre réponse là-bas - - convenablement étiqueté bien sûr :-)