Python应用程序数据环境变量中的变音符号问题
我找不到正确的方法来获取Python中的应用数据路径的环境变量。
问题是我的用户名里有一些特殊字符(德语中的ae和ue)。我在Vista和Windows 7上用PyQt做了一个变通方法,但在XP系统上不管用。
有没有人知道这些环境变量的正确编码方式,或者有什么其他解决这个问题的方法?
1 个回答
10
正如Mike所说,你可以通过getfilesystemencoding
来获取系统的代码页。这种编码方式用于将Windows的本地Unicode字符串转换成字节,这个过程会被Python的所有C标准输入输出函数使用,包括那些需要字节字符串文件路径的文件系统调用,以及os.environ
。
这意味着你可以直接从os.environ
读取包含非ASCII字符的字符串,并且可以直接用它作为文件路径,而不需要进行任何特别的编码或解码步骤。
不过,如果%APPDATA%
变量中包含系统代码页中没有的Unicode字符,比如在一个使用德语(cp1252)的Windows系统上,你的路径是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
字典直接包含从Windows获取的Unicode字符串,没有经过代码页编码,所以在这里你不需要担心这个问题。