Вход системы доступа как двоичный код в python

Я поклонник Python 3 для решения проблем с юникодом. Однако в одном месте я не уверен, что он делает.

Насколько я понимаю, переменные argv и среды передаются из ОС в исполняемый файл python в виде байтов. Python выбирает кодировку, и данные подвергаются пользовательской программе как строки unicode в sys.argv и os.environ .

Я не могу понять, как python выбирает эту кодировку. Я думал, что это с переменными LC, но это, похоже, не работает.

$ printf -v CENTS 'xC2xA2' ; export CENTS ; echo "0xC2 0xA2 in UTF-8 is $CENTS"
0xC2 0xA2 in UTF-8 is ¢
$ printf -v LBS 'xC2xA3' ; echo "0xC2 0xA3 in UTF-8 is $LBS"
0xC2 0xA3 in UTF-8 is £
$ cat <<EOF >test.py
import os, sys
print("0xC2 0xA2 decodes to", *(hex(ord(c)) for c in os.environ.get("CENTS")))
print("0xC2 0xA3 decodes to", *(hex(ord(c)) for c in sys.argv[1]))
EOF
$ python3 test.py $LBS
0xC2 0xA2 decodes to 0xa2
0xC2 0xA3 decodes to 0xa3
$ LC_ALL=es_ES.ISO8859-1 python3 test.py $LBS
0xC2 0xA2 decodes to 0xa2
0xC2 0xA3 decodes to 0xa3

Я ожидал, что второй даст 0xc2 0xa2 и 0xc2 0xa3, но, похоже, LC_ALL не имеет значения.

Есть ли способ обойти кодировку и просто увидеть двоичные данные, предоставленные исполняемому файлу?

Необязательно, как Python выбирает кодировку и где она ее раскрывает? Я думал, что это было sys.getfilesystemencoding() в sys.getfilesystemencoding() но у него очень редкие документы, которые ничего не разъясняют. Особо следует отметить указатели на официальную документацию.

Всего 1 ответ


По связанным ответам и документации, на которую они ссылаются, вот короткий ответ:

Для os.environ см. os.environb , который доступен для систем, отличных от Windows, и обеспечивает прямой доступ к базовым байтам.

sys.argv автоматически декодируется в объект Unicode с использованием специализированного множества системных кодировок (взятых из Я думаю, LANG ), а исходные байты не отображаются напрямую. Для доступа к ним, более или менее надежно, я думаю, вы можете использовать os.fsencode .

У меня такое чувство, что это можно поиграть, но я продолжу это позже.


Есть идеи?

10000