7
votes

Quel est le type de contenu / briet de contenu par défaut?

Selon cette réponse: Urllib2 Lire à Unicode

Je dois obtenir le type de contenu pour pouvoir passer à Unicode. Cependant, certains sites Web n'ont pas de "charset".

par exemple, le ["Type de contenu"] pour Cette page est" Texte / HTML ". Je ne peux pas le convertir en Unicode. xxx

existe un "codage" par défaut (anglais, bien sûr) ... de sorte que si rien n'est trouvé, je peux juste Utilisez cela?


4 commentaires

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 :-)


4 Réponses :


0
votes

htmlsource = htmlsource.decode ("utf8") doit fonctionner pour la plupart des cas, sauf que vous écrasez des sites d'encodage non anglais.

ou vous pouvez écrire la fonction de décodage de force comme ceci: xxx


7 commentaires

cp1252 et utf16 décodera avec succès toute séquence d'octets , donc une de celles-ci devraient aller à la fin. (Je suggère CP1252 ; 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' . 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 :-)



3
votes

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?

Non, il n'y a pas. Vous devez deviner.

Approche triviale: essayez de décoder comme utf-8 . 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 , le codage européen de Windows Western Europe. (Qui est comme ISO-8859-1; en fait, la plupart des navigateurs utiliseront CP1252 au lieu de ISO-8859-1 Même si vous spécifiez que Charset, il vaut donc la peine de faire dupliquer que comportement.)

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 .


10 commentaires

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 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 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



0
votes

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.

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 3 est aussi vaut la peine de lire.


0 commentaires

3
votes

Eh bien, je viens de parcourir l'URL donnée, qui redirige vers xxx

puis frapper ctrl + u (Voir la source) Firefox et il montre xxx

@konrad: que voulez-vous dire "semble comme si ... utilise ISO-8859-1" ??

@ Alex: Qu'est-ce qui vous fait penser qu'il n'a pas de "charset" ??

Regardez le code que vous avez (que nous devinez est la ligne qui cause l'erreur (s'il vous plaît Toujours montrer le message complet message d'erreur!)): xxx

et le message d'erreur: xxx

Cela signifie que Unicode ne se réfère pas à la fonction intégrée, il fait référence à un int . Je me souviens que dans votre autre question, vous avez eu quelque chose comme xxx

Je suggère d'utiliser un autre nom pour cette variable - dites utilisez_unicode.

Plus Suggestions: (1) Montrez toujours suffisamment de code pour reproduire l'erreur (2) Lisez toujours le message d'erreur.


1 commentaires

+1 belle trouvaille, je n'ai pas réalisé qu'il remplace la fonction Unicode intégrée