В Python можно прочитать кодировку файловой системы с помощью sys.getfilesystemencoding().
Но, похоже, нет официального способа установить кодировку файловой системы.
См.: Как изменить кодировку файловой системы с помощью python?
Я нашел этот грязный хак:
import sys
sys.getfilesystemencoding = lambda: 'UTF-8'
Есть ли лучшее решение, если изменение переменной среды LANG перед запуском интерпретатора невозможно?
Фон, почему я хочу этого:
Это работает:
user@host:~$ python src/setfilesystemencoding.py
LANG: de_DE.UTF-8
sys.getdefaultencoding(): ascii
sys.getfilesystemencoding(): UTF-8
Это не работает:
user@host:~$ LANG=C python src/setfilesystemencoding.py
LANG: C
sys.getdefaultencoding(): ascii
sys.getfilesystemencoding(): ANSI_X3.4-1968
Traceback (most recent call last):
File "src/setfilesystemencoding.py", line 10, in <module>
with open('/tmp/german-umlauts-üöä', 'wb') as fd:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 20-22: ordinal not in range(128)
Вот простой скрипт:
# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, unicode_literals, print_function
import os, sys
print('LANG: {}'.format(os.environ['LANG']))
print('sys.getdefaultencoding(): {}'.format(sys.getdefaultencoding()))
print('sys.getfilesystemencoding(): {}'.format(sys.getfilesystemencoding()))
with open('/tmp/german-umlauts-üöä', 'wb') as fd:
fd.write('foo')
Я надеялся, что описанное выше исправление обезьяны решит эту проблему ... но это не так. Извините, этот вопрос больше не имеет смысла. Я закрываю его.
Мое решение: используйте LANG=C.UTF-8