Проблемы с умлаутами в переменной окружения appdata в python

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

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

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

1 ответ

Решение

Как говорит Майк, вы можете получить системную кодовую страницу от getfilesystemencoding, Эта кодировка используется для преобразования собственных строк Unicode в Windows в байты для всех функций C stdio, используемых Python, включая вызовы файловой системы, использующие пути к файлам байтовых строк, и os.environ,

Это означает, что вы сможете читать строки с не-ASCII-символами из os.environ и использовать его непосредственно как путь к файлу без какого-либо специального шага кодирования / декодирования.

К сожалению, если %APPDATA% переменная содержит символы Unicode, которых нет в системной кодовой странице - например, если при установке Windows на немецком языке (cp1252) ваш путь был C:\Documents and Settings\αβγ\Application Data - тогда эти персонажи уже будут искалечены, прежде чем вы сможете использовать их. Расшифровка строки байта, которую вы получаете в Unicode, с использованием файловой системы кодирования в этом случае не поможет.

Вот функция, которую вы можете использовать в последних версиях Python, которые имеют ctypes расширение, чтобы прочитать Windows родные переменные среды Unicode.

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

Другие вопросы по тегам