Проблемы с умлаутами в переменной среды appdata python - PullRequest
8 голосов
/ 09 апреля 2010

Я не могу найти правильный способ получить переменную среды для пути appdata в python.

Проблема в том, что мое имя пользователя включает в себя специальные символы (немецкий ae и ue). Я сделал обходной путь с PyQt для Vista и Windows 7, но он не работает для XP Systems.

Кто-нибудь знает правильную кодировку этих переменных среды или другое решение этой проблемы?

1 Ответ

9 голосов
/ 09 апреля 2010

Как говорит Майк, вы можете получить системную кодовую страницу от 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 без кодировки, поэтому вам не нужно беспокоиться об этой проблеме.

...