Я хочу, чтобы мой Python script мог читать аргументы командной строки Unicode в Windows. Но похоже, что sys.argv - это строка, закодированная в некотором локальном кодировании, а не в Unicode. Как я могу прочитать командную строку в полном Unicode?
Пример кода: 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)
На моем ПК, настроенном для японской кодовой страницы, я получаю:
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>
Этот Shift-JIS закодирован, я верю, и он "работает" для этого имени файла. Но он ломается для имен файлов с символами, которые не находятся в наборе символов Shift-JIS - окончательный "открытый" вызов завершается с ошибкой:
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'
Примечание. Я говорю о Python 2.x, а не Python 3.0. Я обнаружил, что Python 3.0 дает sys.argv
как правильный Unicode. Но еще немного до перехода на Python 3.0 (из-за отсутствия поддержки сторонней библиотеки).
Update:
Несколько ответов сказали, что я должен декодировать в соответствии с тем, что закодировано в sys.argv
. Проблема заключается в том, что он не является полным Unicode, поэтому некоторые символы не могут быть представлены.
Вот пример использования, который дает мне печаль: у меня включено перетаскивание файлов на .py файлы в Проводнике Windows. У меня есть имена файлов со всеми типами символов, в том числе некоторые не на системной странице кода по умолчанию. Мой Python script не получает правильные имена файлов Unicode, переданные ему через sys.argv во всех случаях, когда символы не отображаются в текущей кодировке кодовой страницы.
Конечно, есть некоторый Windows API для чтения командной строки с полным Unicode (и Python 3.0 делает это). Я предполагаю, что интерпретатор Python 2.x не использует его.