0

我在葡萄牙的用户计算机上运行 python 程序,用户的用户名包含 unicode 字符。我希望os.path.expanduser('~')返回一些功能性的东西,因为我将结果路径用于某些文件操作,但它当前返回strunicode 字符串的 python 表示:

>>> import os
>>> os.path.expanduser('~')
'C:\\Users\\V\xe2nia'

但这是一个 python 字符串......我怎样才能将它转换为 Windows 将识别为有效文件路径的实际 unicode 字符串?

4

2 回答 2

7

该函数返回一个字节字符串,而不是一个 unicode 字符串。鉴于用于字符串的编码,您需要对其进行解码。

os.path.expanduser('~').decode(sys.getfilesystemencoding())

我在这里假设使用的编码是文件系统编码,可以通过sys.getfilesystemencoding(). 从这里看起来像 latin-1,但你不能确定。

您还可以尝试传入一个unicode路径os.path.expanduser()并让 Python 为您进行解码:

os.path.expanduser(u'~')

请阅读Python Unicode HOWTO中的这个和其他 Unicode 问题。如果您不了解编码字节串和 Unicode 字符串之间的区别,请阅读这篇优秀的文章。

于 2012-11-07T17:52:51.453 回答
1

仅当主目录的路径实际上可以在文件系统编码中表达时,使用文件系统编码将字节字符串解码为 Unicode 才有效。

在 Windows 上,用于 byte-string-file-path I/O 的文件系统编码是依赖于语言环境的“ANSI 代码页”,不幸的是,它从来不是 UTF,所以总有一些字符不能用字节表示-string-file-path 函数。例如,如果用户名包含一个日文字符,但它是西欧 Windows 安装(使用代码页 1252,类似于 ISO-8859-1),Martijn 的示例将失败。

在大多数使用 C 标准库基于字节字符串的文件 I/O 函数的语言上,这就是它的结尾:在 Java 等中,您根本无法访问名称包含 ANSI 代码页之外的字符的文件。

幸运的是,Python 使用本机 Win32 API 调用而不是 C 标准库,对 Windows 的 Unicode 文件名有特定的支持。使用这些,您可以获得 Windows 理解的真实 Unicode 文件名,避免将其转换为字节字符串并返回时所涉及的有损修改。

通常,您只需将 Unicode 字符串传递给您正在调用的函数即可触发 Python 2 中的 Unicode 文件名支持。Python 将返回 Unicode 字符串作为响应:

>>> import os
>>> os.path.expanduser(u'~')
u'C:\\Users\\V\xe2nia'
于 2012-11-11T01:21:34.173 回答