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.