Как говорит Майк, вы можете получить системную кодовую страницу от getfilesystemencoding
. Эта кодировка используется для преобразования собственных строк Unicode в Windows в байты для всех функций C stdio, используемых Python, включая вызовы файловой системы, использующие filepaths байтовых строк, и os.environ
.
Это означает, что вы сможете прочитать строку с не-ASCII-символами из os.environ
и использовать ее непосредственно как путь к файлу без какого-либо специального шага кодирования / декодирования.
К сожалению, если переменная %APPDATA%
содержит символы Unicode, которых нет в системной кодовой странице - например, если при установке Windows на немецком языке (cp1252) ваш путь был C:\Documents and Settings\αβγ\Application Data
- тогда эти символы уже будут покалечили, прежде чем вы получите возможность использовать их. Расшифровка строки байта, которую вы получаете в Unicode, с использованием файловой системы кодирования в этом случае не поможет.
Вот функция, которую вы можете использовать в последних версиях Python с расширением ctypes
для чтения собственных переменных среды Unicode в Windows.
def getEnvironmentVariable(name):
name= unicode(name) # make sure string argument is unicode
n= ctypes.windll.kernel32.GetEnvironmentVariableW(name, None, 0)
if n==0:
return None
buf= ctypes.create_unicode_buffer(u'\0'*n)
ctypes.windll.kernel32.GetEnvironmentVariableW(name, buf, n)
return buf.value
В Python 3 словарь os.environ
содержит строки Unicode, взятые непосредственно из Windows без кодировки, поэтому вам не нужно беспокоиться об этой проблеме.