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 ở đó.
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
'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
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