Подтвердить что ты не робот

Python: Какая кодировка используется для обработки sys.argv?

В какой кодировке находятся элементы sys.argv, в Python? закодированы ли они кодировкой sys.getdefaultencoding()?

sys.getdefaultencoding(): возвращает имя текущей строковой кодировки по умолчанию, используемой в реализации Unicode.

PS: Как было указано в некоторых ответах, sys.stdin.encoding действительно было бы лучшим предположением. Мне бы хотелось увидеть окончательный ответ на этот вопрос, хотя и с указателями на солидные источники!

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

4b9b3361

Ответ 1

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

Для Python 2.x см. этот комментарий для issue2128.

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

Ответ 2

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

Ответ 3

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

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

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

В IDLE:

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

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

Немного позже: sys.argv закодирован с помощью sys.stdin.encoding, а не sys.getdefaultencoding()

Ответ 4

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

В Windows это будет в коде ANSI системы.

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

Ответ 5

Несколько наблюдений:

(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 никогда не сработает.

Ответ 6

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