Python: quel encodage est utilisé pour traiter sys.argv?
Dans quel encodage sont les éléments de sys.argv
, en Python? sont-ils codés avec le codage sys.getdefaultencoding()
?
Sys.getdefaultencoding (): renvoie le nom de l'encodage de chaîne par défaut utilisé par L'implémentation Unicode.
PS: Comme l'a souligné dans certaines réponses, sys.stdin.encoding
serait en effet une meilleure deviner. J'aimerais voir une réponse définitive à cette question, cependant, avec des pointeurs vers des sources solides!
PPS : comme Wim souligné, Python 3 résout ce problème en mettant des objets str
dans sys.argv (si je comprends bien). La question reste ouverte pour Python 2.x, cependant. Sous Unix, la variable D'environnement LC_CTYPE semble être la bonne chose à vérifier, Non? Ce qui devrait être fait avec Windows (de sorte que sys.les éléments argv sont correctement interprétés quelle que soit la console)?
6 réponses
" ce qui devrait être fait avec Windows (de sorte que sys.les éléments argv sont correctement interprétés quelle que soit la console)?"
Pour Python 2.x, voir ce commentaire sur issue2128 .
(notez que aucun encodage n'est correct pour le sys d'origine.argv, parce que certains caractères peuvent avoir été mutilés de manière à ce qu'il n'y ait pas assez d'informations à annuler; par exemple, si la page de Code ANSI ne peut pas représenter l'alpha Grec, elle sera mutilée en 'a'.)
Je suppose que vous demandez cela parce que vous avez rencontré numéro 2128 . Notez que cela a été corrigé dans Python 3.0.
Je ne sais pas si cela aide ou non mais c'est ce que je reçois en mode DOS:
C:\Python27>python Lib\codingtest.py нер
['Lib\\codingtest.py', '\xed\xe5\xf0']
C:\Python27>python Lib\codingtest.py hello
['Lib\\codingtest.py', 'hello']
Au ralenti:
>>> print "hello"
hello
>>> "hello"
'hello'
>>> "привет"
'\xef\xf0\xe8\xe2\xe5\xf2'
>>> print "привет"
привет
>>> sys.getdefaultencoding()
'ascii'
>>>
, Que pouvons-nous en déduire? Je ne sais pas encore... Je vais commenter un peu.
Un peu plus tard: sys.argv
est encodé avec sys.stdin.encoding
et pas sys.getdefaultencoding()
Sur les systèmes Unix, il devrait être dans les paramètres régionaux de l'utilisateur, qui n'est (étrangement) pas lié à sys.getdefaultencoding
. Voir http://docs.python.org/library/locale.html.
Sous Windows, ce sera dans la page de Code ANSI du système.
(en passant, les enseignants du primaire qui vous ont dit de ne pas terminer une phrase par une préposition vous mentaient.)
Quelques observations:
(1) ce n'est certainement pas sys.getdefaultencoding
.
(2) sys.stdin.encoding
semble être un bien meilleur pari.
(3) sous Windows, la valeur réelle de sys.stdin.encoding
varie en fonction du logiciel qui fournit le stdio. IDLE utilisera la page de code du système "ANSI", par exemple cp1252
dans la majeure partie de l'Europe occidentale et de L'Amérique et des anciennes colonies de celle-ci. Cependant, dans la fenêtre D'invite de commandes, qui émule plus ou moins MS-DOS, l'ancienne page de code DOS correspondante (par exemple cp850) sera utilisée par défaut. Cela peut être modifié à l'aide de la commande chcp (modifier la page de code).
(4) la documentation du module subprocess ne fournit aucune suggestion sur le codage à utiliser pour args et stdout.
(5) on a confiance que assert sys.stdin.encoding == sys.stdout.encoding
n'échoue jamais.
Sys.getfilesystemencoding () fonctionne pour moi, au moins sur Windows. Sous Windows, il s'agit en fait de 'mbcs' et de 'utf-8' sur *nix.