2010-04-09 36 views
7

Tôi không thể tìm thấy một cách chính xác để có được biến môi trường cho đường dẫn appdata trong python.Vấn đề với umlauts trong python appdata biến môi trường

Vấn đề là tên người dùng của tôi bao gồm các ký tự đặc biệt (ae Đức và ue). Tôi đã thực hiện một cách giải quyết khác với PyQt cho Vista và Windows 7 nhưng nó không hoạt động đối với XP Systems.

Có ai biết mã hóa chính xác của các biến môi trường này hoặc giải pháp khác cho vấn đề này không?

Trả lời

8

Như Mike nói, bạn có thể nhận được mã hệ thống từ getfilesystemencoding. Mã hóa này được sử dụng để chuyển đổi các chuỗi Unicode gốc của Windows thành các byte cho tất cả các hàm stdio C được Python sử dụng, bao gồm các cuộc gọi hệ thống tập tin sử dụng chuỗi filepaths byte và os.environ.

Điều này có nghĩa là bạn sẽ có thể đọc chuỗi có ký tự không phải ASCII từ os.environ và sử dụng trực tiếp dưới dạng tệp phim mà không cần bất kỳ bước mã hóa/giải mã đặc biệt nào.

Thật không may, nếu biến %APPDATA% chứa các ký tự Unicode không có trong mã hệ thống - ví dụ: nếu cài đặt Windows của Đức (cp1252), đường dẫn của bạn là C:\Documents and Settings\αβγ\Application Data - thì những ký tự đó sẽ bị xén trước khi bạn có cơ hội sử dụng chúng. Giải mã chuỗi byte bạn nhận được sang Unicode bằng cách sử dụng hệ thống tập tin sẽ không giúp ích gì trong trường hợp đó.

Đây là chức năng bạn có thể sử dụng trên các phiên bản Python gần đây có phần mở rộng ctypes, để đọc các biến môi trường Unicode nguyên gốc của 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 

Trong Python 3, từ điển os.environ chứa Unicode chuỗi lấy trực tiếp từ Windows với không mã hóa bảng mã, do đó bạn không phải lo lắng về vấn đề này ở đó.

+0

Xin chào, cảm ơn bobince vì câu trả lời của bạn. Bằng cách này tôi nhận được đường dẫn Appdata chính xác, nhưng nó không giải quyết được vấn đề với các umlauts. Tôi không thể tìm thấy một cách để giải mã chuỗi unicode từ buf.value một cách đúng đắn. – Heike

+0

'buf.value' đã là một chuỗi Unicode. Bạn không cần phải giải mã nó. Bạn có thể sử dụng chuỗi Unicode trực tiếp dưới dạng tên tệp trên Windows bằng Python 2.3 trở đi (PEP277). – bobince

+0

nhưng os.path.exist (buf.value) trả về false ... nếu tôi dùng thử với tên không có dấu thì nó hoạt động – Heike

Các vấn đề liên quan