2010-04-09 12 views
7

Nie mogę znaleźć poprawnego sposobu pobrania zmiennej środowiskowej dla ścieżki appdata w pythonie.Problemy z umlautami w python appdata environvent variable

Problem polega na tym, że moja nazwa użytkownika zawiera znaki specjalne (niemiecki ae i ue). Zrobiłem obejście PyQt dla Vista i Windows 7, ale to nie działa dla XP Systems.

Czy ktoś zna poprawne kodowanie tych zmiennych środowiskowych lub inne rozwiązanie tego problemu?

Odpowiedz

8

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.

+0

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

+0

'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

+0

, ale os.path.exist (buf.value) zwraca fałsz ... jeśli próbuję go z nazwą bez umlautów to działa – Heike

Powiązane problemy