Lire les caractères Unicode à partir d'arguments de ligne de commande en Python 2.x sur Windows
Je veux que mon script Python pour être en mesure de lire Unicode arguments de ligne de commande dans Windows. Mais il semble que sys.argv est une chaîne de caractères encodée dans certains locaux de l'encodage, plutôt que de l'Unicode. Comment puis-je lire la ligne de commande en Unicode?
Exemple de code: argv.py
import sys
first_arg = sys.argv[1]
print first_arg
print type(first_arg)
print first_arg.encode("hex")
print open(first_arg)
Sur mon PC mis en place pour les Japonais de page de code, j'obtiens:
C:\temp>argv.py "PC・ソフト申請書08.09.24.doc"
PC・ソフト申請書08.09.24.doc
<type 'str'>
50438145835c83748367905c90bf8f9130382e30392e32342e646f63
<open file 'PC・ソフト申請書08.09.24.doc', mode 'r' at 0x00917D90>
C'est Shift-JIS codées je crois, et il "travaille" pour que le nom de fichier. Mais il casse pour les noms de fichiers avec des caractères qui ne sont pas dans le Shift-JIS jeu de caractères—la finale "ouvrir" appel échoue:
C:\temp>argv.py Jörgen.txt
Jorgen.txt
<type 'str'>
4a6f7267656e2e747874
Traceback (most recent call last):
File "C:\temp\argv.py", line 7,
in <module>
print open(first_arg)
IOError: [Errno 2] No such file or directory: 'Jorgen.txt'
Remarque—je parle de Python 2.x, pas de Python 3.0. J'ai trouvé que Python 3.0 donne sys.argv
comme bon Unicode. Mais c'est un peu tôt encore pour la transition vers Python 3.0 (en raison du manque de 3ème partie de la bibliothèque de support).
Mise à jour:
Quelques réponses ont dit que je doit décoder selon quelle que soit la sys.argv
est encodé en. Le problème c'est qu'il n'est pas Unicode complète, de sorte que certains caractères ne sont pas représentable.
Voici les cas d'utilisation qui me donne du chagrin: j'ai permis de glisser-déposer des fichiers sur des .py fichiers dans l'Explorateur Windows. J'ai les noms de fichiers avec toutes sortes de personnages, dont certains pas dans le système de page de code par défaut. Mon script Python ne pas obtenir le droit des noms de fichiers Unicode transmises via sys.argv dans tous les cas, quand les personnages ne sont pas représentable dans le code actuel, le codage de la page.
Il y a certainement des API Windows pour lire la ligne de commande avec Unicode (et Python 3.0 t-il). Je suppose que le Python 2.x interprète n'est pas à l'utiliser.
- Cochez cette question posée ici sur un Débordement de Pile, il doit fournir la réponse à votre question: stackoverflow.com/questions/477061/...
- Oui, semble être un exact de la dup.
- Cette question et ses réponses en parler raw_input() (même si la question de la mention "ligne de commande" une fois). Je suis intéressé dans la ligne de commande, par exemple sys.argv.
- Bien essentiellement, vous boucle sur sys.argv comme ceci: pour les arg dans sys.argv: imprimer arg.decode("utf-8"), j'ai utilisé de l'impression, mais vous devez faire ce que vous avez besoin. Vous pouvez également choisir le bon encodage que vous avez besoin.
- N'Japonaise de Windows utilisez les polices raster sur la console par défaut? Ce ne serait sans doute de les limiter à un affichage de caractères dans Windows 932 page de code. Voir support.microsoft.com/kb/Q99795 (c'est une question distincte de la lecture de la args, mais peut avoir une certaine incidence)
Vous devez vous connecter pour publier un commentaire.
Voici une solution qui est juste ce que je suis à la recherche d', de faire un appel à la Windows
GetCommandLineArgvW
fonction:Obtenir sys.argv avec les caractères Unicode sous Windows (à partir de ActiveState)
Mais j'ai fait plusieurs modifications pour simplifier son utilisation et de mieux gérer certaines utilisations. Voici ce que j'utilise:
win32_unicode_argv.py
Maintenant, la façon dont j'utilise c'est de faire simplement:
et à partir de là,
sys.argv
est une liste de chaînes Unicode. Le Pythonoptparse
module semble heureux de l'analyser, ce qui est excellent.\"
, dans ce cas, ce code ajoute"
pour le paramètre. Pouvez-vous résoudre ce problème?argv
?"1\"
, le code indique qu'il1"
. Barre oblique inverse n'échappe pas à"
sur windows, est-il?xrange()
; quand je l'ai changé pourrange()
, la valeur retournée n'est pas unicode.win-unicode-console
package: github.com/Drekin/win-unicode-console.Traiter avec des encodages est très déroutant.
Je croire si votre entrée de données via la ligne de commande, il va encoder les données quel que soit votre système d'encodage est et n'est pas unicode. (Même le copier/coller ce faire)
Donc, il devrait être correct pour décoder en unicode en utilisant le système de codage:
exécutant la commande suivante Permettra de sortie:
Invite> python myargv.py "PC-ソフト申請書08.09.24.txt"
Où l' "PC-ソフト申請書08.09.24.txt" contenait le texte, "日本語".
(J'ai codé le fichier en utf8 à l'aide de bloc-notes de windows, je suis un peu perplexe quant à pourquoi il y a un"? " dans le début lors de l'impression. Quelque chose à voir avec la façon dont le bloc-notes enregistre utf8?)
Les chaînes de "décoder" la méthode ou de l'unicode() builtin peut être utilisé pour convertir un encodage en unicode.
Aussi, si vous traitez avec des fichiers encodés vous pouvez utiliser les codecs.fonction open() à la place de l'intégré dans le open(). Il permet de définir l'encodage du fichier, et ensuite utiliser le codage donnée de manière transparente décoder le contenu au format unicode.
Ainsi, lorsque vous appelez
content = codecs.open("myfile.txt", "r", "utf8").read()
content
sera en unicode.codecs.ouvert:
http://docs.python.org/library/codecs.html?#codecs.open
Si je suis miss-comprendre quelque chose s'il vous plaît laissez-moi savoir.
Si vous ne l'avez pas déjà, je vous recommande la lecture de Joel article sur unicode et l'encodage:
http://www.joelonsoftware.com/articles/Unicode.html
Essayez ceci:
Peut-être que vous devez remplacer
CP437
ouCP1252
pourUTF-8
. Vous devriez être en mesure de déduire le codage approprié le nom de la clé de registreHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\OEMCP
De la ligne de commande peut être dans le codage de Windows. Essayez de décoder les arguments en
unicode
objets: