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

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

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

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

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

6 ответов


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

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

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


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


Я не знаю, помогает ли это или нет, но это то, что я получаю в режиме 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()


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

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

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


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

(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 никогда не подводит.


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