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

23
demandé sur Eric Lebigot 2010-10-25 11:23:47

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'.)

4
répondu Daira Hopwood 2011-01-10 01:47:00

Je suppose que vous demandez cela parce que vous avez rencontré numéro 2128 . Notez que cela a été corrigé dans Python 3.0.

8
répondu Wim Coenen 2010-11-03 09:44:46

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

5
répondu soulseekah 2010-10-25 08:06:07

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

4
répondu Glenn Maynard 2010-10-25 07:34:14

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.

4
répondu John Machin 2010-10-25 09:50:38

Sys.getfilesystemencoding () fonctionne pour moi, au moins sur Windows. Sous Windows, il s'agit en fait de 'mbcs' et de 'utf-8' sur *nix.

0
répondu GPCracker 2016-12-09 16:18:33