我在葡萄牙的用户计算机上运行python程序,用户的用户名包含unicode字符。我希望os.path.expanduser('~')
返回一些功能,因为我将结果路径用于某些文件操作,但它当前返回一个unicode字符串的python str
表示:
>>> import os
>>> os.path.expanduser('~')
'C:\\Users\\V\xe2nia'
但这是一个python字符串...如何将其转换为Windows将识别为有效文件路径的实际unicode字符串?
答案 0 :(得分:7)
该函数返回一个字节字符串,而不是unicode字符串。考虑到用于字符串的编码,您需要对其进行解码。
os.path.expanduser('~').decode(sys.getfilesystemencoding())
我在此假设所使用的编码是文件系统编码,可通过sys.getfilesystemencoding()
获取。从这里看起来像拉丁语1,但你无法确定。
您还可以尝试将 unicode 路径传递给os.path.expanduser()
,并让Python为您执行解码:
os.path.expanduser(u'~')
请阅读Python Unicode HOWTO中的此问题和其他Unicode问题。如果您不理解编码的字节字符串和Unicode字符串之间的区别,请同时阅读this excellent article。
答案 1 :(得分:1)
只有在文件系统编码中实际可以表达主目录的路径时,才能使用文件系统编码将字节串解码为Unicode。
在Windows上,用于字节字符串文件路径I / O的文件系统编码是依赖于语言环境的“ANSI代码页”,遗憾的是,它不是UTF,因此总是存在不能使用的字符以字节字符串文件路径函数表示。因此,例如,如果用户的名字包含日文字符,但它是西欧Windows安装(使用代码页1252,类似于ISo-8859-1),Martijn的示例将失败。
在大多数使用C标准库基于字节串的文件I / O函数的语言中,它就是它的结尾:在Java等人中,你根本无法访问名称具有ANSI代码页之外字符的文件
幸运的是,Python特别支持Windows的Unicode文件名,使用本机Win32 API调用而不是C标准库。使用这些,您可以获得真正的Unicode文件名,因为Windows可以理解它,避免了将其转换为字节字符串并返回时所涉及的有损错误。
通常,只需将Unicode字符串传递给您正在调用的函数,就可以在Python 2中触发Unicode文件名支持。 Python将返回Unicode字符串作为响应:
>>> import os
>>> os.path.expanduser(u'~')
u'C:\\Users\\V\xe2nia'