仅当主目录的路径实际上可以在文件系统编码中表达时,使用文件系统编码将字节字符串解码为 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'