La conversion de format ascii vers le format utf-8 avec Python
J'ai xmpp bot écrit en python. L'un de ses plugins est capable d'exécuter des OS les commandes et envoyer la sortie à l'utilisateur. Autant que je sache, la sortie doit être en unicode comme pour l'envoyer sur le protocole xmpp. J'ai donc essayé de manipuler de cette façon:
output = os.popen(cmd).read()
if not isinstance(output, unicode):
output = unicode(output,'utf-8','ignore')
bot.send(xmpp.Message(mess.getFrom(),output))
Mais lorsque russe symboles apparaissent dans la sortie ils ne sont pas convertis.
sys.getdefaultencoding()
dit que par défaut l'invite de commande de codage est 'ascii', mais quand j'essaie de faire
output.decode('ascii')
dans la console python-je obtenir
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0x92 in position 1:
ordinal not in range(128)
Système d'exploitation: Win XP, Python 2.5.4
PS: Désolé pour mon anglais 🙁
Avez-vous essayé de sortie
Évolution de la production.decode('866') m'a aidé. Mais locale.getpreferredencoding(do_setlocale=True) retourné cp1251. Est-il un autre moyen de déterminer le codage? Parce que ce bot devrait fonctionner sous linux ainsi
Erm... ASCII est déjà un parfait sous-ensemble de l'UTF-8! Tout texte ASCII est, par définition, un texte UTF-8. C'est le contraire, l'intention ici ou est-colriot demandant de le convertir en un autre encodage UTF-8?
output = output.encode("utf-8')
?Évolution de la production.decode('866') m'a aidé. Mais locale.getpreferredencoding(do_setlocale=True) retourné cp1251. Est-il un autre moyen de déterminer le codage? Parce que ce bot devrait fonctionner sous linux ainsi
Erm... ASCII est déjà un parfait sous-ensemble de l'UTF-8! Tout texte ASCII est, par définition, un texte UTF-8. C'est le contraire, l'intention ici ou est-colriot demandant de le convertir en un autre encodage UTF-8?
OriginalL'auteur colriot | 2010-02-14
Vous devez vous connecter pour publier un commentaire.
Vous dites """sys.getdefaultencoding() dit que le défaut d'invite de commande de codage est 'ascii'"""
sys.getdefaultencoding ne dit RIEN sur la "invite de commande" encoding.
Sur Windows,
sys.stdout.encoding
devrait faire le travail. Sur ma machine, il contientcp850
quand Python est exécuté dans une fenêtre d'Invite de Commande, etcp1252
dans le vide. La vôtre doit contenircp866
etcp1251
respectivement.Mise à jour Vous dire que vous avez encore besoin de cp866 dans le vide. À noter:
Alors, quand le démarrage de l'application, vérifier si vous êtes sous Windows et si oui, d'analyser le résultat de
os.popen('chcp').read()
. Le texte avant de le:
est probablement dépendant de paramètres régionaux.codepage = result.split()[-1]
peut être assez bon "analyse". Sur Unix, qui n'ont pas de Windows/MS-DOS dédoublement de la personnalité,sys.stdout.encoding
devrait être OK.Ou pas. Comment puis-je trouver de l'os.popen(commande).read() codage par défaut? Ou cela dépend de la commande?
os.popen("commande").read() codage par défaut?? Aucun de ces concepts. Le codage des données transmises est choisi par le (ou contraint) de l'ÉCRIVAIN; il n'a rien à voir avec le LECTEUR, qui doit connaître ou deviner l'encodage ou obtenir de l'encodage à partir d'une source fiable. Pourquoi me demandez-vous? Pourquoi est-sys.la sortie standard stdout.encodage pas exactement ce que tu voulais?
Parce qu'il n'a pas d'importance si vous allez exécuter python à partir de l'Invite de Commande ou INACTIF. 'cp866' est le bon choix dans les deux cas.
Je veux dire, dans le vide tout va bien seulement avec "cp866'
OriginalL'auteur John Machin
sys.getdefaultencoding()
retourne python encodage par défaut - qui est l'ASCII, sauf si vous l'avez changé. ASCII ne supporte pas les caractères russes.Vous devez savoir ce que le codage du texte proprement dit est, que ce soit manuellement ou à l'aide de la module local.
Généralement quelque chose comme:
cp1251
dans le cas des OP (russe) de l'installation, même quand Python est exécuté à MS-DOS-émulation de l'invite de commandes; la coopérative doitcp866
.OriginalL'auteur Douglas Leeder
Ascii n'a pas défini les valeurs de caractère au-dessus de 127 0x7F. Peut-être vous dire le Cyrillique code de la page? C'est 866
Voir http://en.wikipedia.org/wiki/Code_page
edit: étant donné que cette réponse a été marquée correcte sans doute 886 travaillé, mais comme d'autres réponses ont souligné, 886 n'est pas la seule langue russe de page de code. Si vous utilisez une page de code différent de celui qui a été utilisé lors de la russie symboles codés, vous obtiendrez le résultat erroné.
Mais les résultats d'une.decode('cp866") et d'une.decode('koi8-r') sont différents
Si il y a un portable identifiant pour le Cyrillique page de code, il serait préférable de l'utiliser. Glenn, avez-vous une référence pour KOI8-R ?
Code de la page 866 n'est rien comme KOI8-R, ou tout autre russe de l'encodage. Comme un DOS de la page de code vous n'en avez pas, généralement, rencontrer beaucoup plus. Voir en.wikipedia.org/wiki/Code_page_866 et en.wikipedia.org/wiki/KOI8-R vs la plus habituelle en.wikipedia.org/wiki/Windows-1251.
OriginalL'auteur John Knoeller
En Python 'cp855', 'cp866', 'cp1251', 'iso8859_5', 'koi8_r' sont différents russe des pages de code. Vous aurez besoin d'utiliser le droit de décoder la sortie de popen. Dans la console Windows, le " chcp de commande des listes de la page de code utilisée par les commandes de la console. Qui ne sera pas forcément la même page de code que les applications Windows. NOUS Windows, 'cp437" est utilisé pour la console et 'cp1252' est utilisé pour des applications comme le bloc-notes.
OriginalL'auteur Mark Tolonen