Jak mówi Mike, można uzyskać stronę kodową systemu od getfilesystemencoding
. To kodowanie służy do konwersji natywnych ciągów Unicode systemu Windows w bajtach dla wszystkich funkcji C stdio używanych przez Python, w tym wywołań systemów plików używających łańcuchów znaków bajtowych i os.environ
.
Oznacza to, że będziesz w stanie odczytać ciąg znaków spoza ASCII z os.environ
i użyć go bezpośrednio jako ścieżki do plików bez specjalnego kroku kodowania/dekodowania.
Niestety, jeśli zmienna %APPDATA%
zawiera znaki Unicode, które nie są obecne w kodowej systemu - na przykład, jeśli na niemieckim (CP1252) zainstalować Windows ścieżka była C:\Documents and Settings\αβγ\Application Data
- wtedy te postacie będą już zostały zniekształcone przed wami mieć szansę ich użyć. Dekodowanie łańcucha bajtowego, który dostajesz do Unicode, używając systemu plików, nie pomoże w tym przypadku.
Oto funkcja, której można używać w najnowszych wersjach Pythona z rozszerzeniem ctypes
, do odczytywania zmiennych środowiskowych systemu Windows w formacie 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
W Pythonie 3, słownik os.environ
zawiera ciągi Unicode pobierane bezpośrednio z systemu Windows bez kodowania strony kodowej, więc nie trzeba się martwić o ten problem nie istnieje.
Witam, dziękuję Bobrowi za odpowiedź. W ten sposób otrzymuję poprawną ścieżkę Appdata, ale nie rozwiązuje problemu z umlautami. Nie mogę znaleźć sposobu, aby odszyfrować ciąg znaków Unicode z buf.value we właściwy sposób. – Heike
'buf.value' jest już ciągiem znaków Unicode. Nie musisz tego dekodować. Możesz używać ciągów Unicode bezpośrednio jako nazwy plików w systemie Windows w Pythonie 2.3 lub nowszym (PEP277). – bobince
, ale os.path.exist (buf.value) zwraca fałsz ... jeśli próbuję go z nazwą bez umlautów to działa – Heike