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