Je suis en train d'écrire un Python (Python 3.3) programme pour envoyer des données à une page web à l'aide de la méthode POST. Surtout pour le processus de débogage, j'obtiens la page de résultat et l'afficher sur l'écran à l'aide d' print()
fonction.
Le code ressemble à ceci:
conn.request("POST", resource, params, headers)
response = conn.getresponse()
print(response.status, response.reason)
data = response.read()
print(data.decode('utf-8'));
l' HTTPResponse
.read()
méthode retourne un bytes
élément de codage de la page (qui est bien formaté en UTF-8 document), Il semblait correct jusqu'à ce que je me suis arrêté à l'aide d'INACTIVITÉ GUI pour Windows et utilisé la console Windows à la place. Le retour de la page a un U+2014 de caractères (tiret cadratin) dont la fonction d'impression traduit bien dans l'interface utilisateur Windows (je suppose que la Page de Code 1252) mais ce n'est pas dans la Console Windows (la Page de Code 850). Compte tenu de l' strict
comportement par défaut j'obtiens l'erreur suivante:
UnicodeEncodeError: 'charmap' codec can't encode character '\u2014' in position 10248: character maps to <undefined>
J'ai pu le résoudre en utilisant ce assez moche code:
print(data.decode('utf-8').encode('cp850','replace').decode('cp850'))
Maintenant il remplacer la délinquance caractère "-" avec un ?
. Pas le cas idéal (un trait d'union doivent être mieux de remplacement), mais assez bon pour mon but.
Il y a plusieurs choses que je n'aime pas à partir de ma solution.
- Le code est moche avec tout ce que le décodage, de codage et de décodage.
- Il résout le problème pour ce cas. Si je port le programme pour un système utilisant un autre encodage (latin-1, cp437, dos à cp1252, etc.) il convient de reconnaître la cible de codage. Il ne le fait pas. (par exemple, en utilisant de nouveau le RALENTI GUI, le emdash est également perdu, qui n'était pas le cas avant)
- Il serait plus agréable si la emdash traduit un trait d'union au lieu d'une interrogation bang.
Le problème n'est pas la emdash (je peux penser à plusieurs façons de résoudre particulièrement problème) mais j'ai besoin d'écrire du code robuste. Je suis l'alimentation de la page avec des données provenant d'une base de données et que les données peuvent revenir. Je peux anticiper de nombreux autres cas de conflit: un 'Á' U+00c1 (ce qui est possible dans ma base de données) pourrait se traduire par des CP-850 (DOS/Windows Console encodign pour les Langues d'europe Occidentale), mais pas en CP-437 (codant pour l'anglais AMÉRICAIN, qui est par défaut dans de nombreuses installations de Windows).
Donc, la question:
Est-il une meilleure solution que fait mon code agnostique à partir de la sortie de l'interface d'encodage?