Python: Какая кодировка используется для обработки sys.argv? - PullRequest
24 голосов
/ 25 октября 2010

В какой кодировке находятся элементы sys.argv в Python?они кодируются с помощью кодировки sys.getdefaultencoding()?

sys.getdefaultencoding (): Возвращает имя текущей строковой кодировки по умолчанию, используемой реализацией Unicode.1009 * PS : Как указывалось в некоторых ответах, sys.stdin.encoding действительно было бы лучше догадка .Хотелось бы увидеть окончательный ответ на этот вопрос, однако, с указателями на надежные источники!

PPS : Как указал Вим, Python 3 решает эту проблему, помещая str объектыв sys.argv (если я правильно понимаю).Однако вопрос остается открытым для Python 2.x.Под Unix, переменная окружения LC_CTYPE, кажется, правильная вещь для проверки, нет?Что делать с Windows (чтобы элементы sys.argv правильно интерпретировались независимо от консоли)?

Ответы [ 6 ]

8 голосов
/ 03 ноября 2010

Полагаю, вы спрашиваете об этом, потому что столкнулись с выпуском 2128 . Обратите внимание, что это было исправлено в Python 3.0.

6 голосов
/ 25 октября 2010

Несколько замечаний:

(1) Это, конечно, не sys.getdefaultencoding.

(2) sys.stdin.encoding представляется намного лучшей ставкой.

(3) В Windows фактическое значение sys.stdin.encoding будет варьироваться в зависимости от того, какое программное обеспечение предоставляет stdio.IDLE будет использовать системную кодовую страницу «ANSI», например, cp1252 в большинстве стран Западной Европы и Америки и в их бывших колониях.Однако в окне командной строки, которое более или менее эмулирует MS-DOS, по умолчанию будет использоваться соответствующая старая кодовая страница DOS (например, cp850).Это можно изменить с помощью команды CHCP (изменить кодовую страницу).

(4) Документация для модуля подпроцесса не содержит никаких предложений о том, какую кодировку использовать для args и stdout.

(5) Мы верим, что assert sys.stdin.encoding == sys.stdout.encoding никогда не подведет.

5 голосов
/ 25 октября 2010

Я не знаю, помогает ли это или нет, но вот что я получаю в режиме DOS:

C:\Python27>python Lib\codingtest.py нер
['Lib\\codingtest.py', '\xed\xe5\xf0']

C:\Python27>python Lib\codingtest.py hello
['Lib\\codingtest.py', 'hello']

В режиме ожидания:

>>> print "hello"
hello
>>> "hello"
'hello'
>>> "привет"
'\xef\xf0\xe8\xe2\xe5\xf2'
>>> print "привет"
привет
>>> sys.getdefaultencoding()
'ascii'
>>> 

Что мы можем из этого сделать?Я пока не знаю ... Я прокомментирую немного.

Чуть позже : sys.argv кодируется sys.stdin.encoding, а не sys.getdefaultencoding()

4 голосов
/ 10 января 2011

"Что делать с Windows (чтобы элементы sys.argv правильно интерпретировались независимо от консоли)?"

Для Python 2.x см. этот комментарий к проблеме2128 .

(Обратите внимание, что кодировка no является правильной для исходного sys.argv, поскольку некоторые символы могли быть искажены таким образом, что для отмены недостаточно информации; например, если ANSIкодовая страница не может представлять греческую альфу, тогда она будет искажена до «а».)

4 голосов
/ 25 октября 2010

В системах Unix он должен находиться в локали пользователя, которая (как ни странно) не привязана к sys.getdefaultencoding.См. http://docs.python.org/library/locale.html.

В Windows это будет в системной кодовой странице ANSI.

(Кстати, те учителя начальной школы, которые сказали вам не заканчивать предложение предлогом, быливру.)

0 голосов
/ 09 декабря 2016

sys.getfilesystemencoding () работает у меня, по крайней мере, на Windows.В Windows это на самом деле «mbcs» и «utf-8» в * nix.

...