Python 如何将unicode字符串的str表示形式转换为unicode?

Python 如何将unicode字符串的str表示形式转换为unicode?,python,unicode,Python,Unicode,我在葡萄牙的用户计算机上运行一个python程序,用户的用户名包含unicode字符。我想让os.path.expanduser(“~”)返回一些函数,因为我将结果路径用于某些文件操作,但它当前返回unicode字符串的pythonstr表示: >>> import os >>> os.path.expanduser('~') 'C:\\Users\\V\xe2nia' 但这是一个python字符串。。。如何将其转换为Windows将识别为有效文件路径的实际

我在葡萄牙的用户计算机上运行一个python程序,用户的用户名包含unicode字符。我想让
os.path.expanduser(“~”)
返回一些函数,因为我将结果路径用于某些文件操作,但它当前返回unicode字符串的python
str
表示:

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

但这是一个python字符串。。。如何将其转换为Windows将识别为有效文件路径的实际unicode字符串?

该函数返回的是字节字符串,而不是unicode字符串。考虑到字符串使用的编码,您需要对其进行解码

os.path.expanduser('~').decode(sys.getfilesystemencoding())
我在这里假设使用的编码是文件系统编码,它可以通过。从这里看起来像拉丁语-1,但你不能确定

您还可以尝试将unicode路径传递到
os.path.expanduser()
,并让Python为您解码:

os.path.expanduser(u'~')

请阅读本手册中有关此问题和其他Unicode问题的内容。如果您不理解编码的bytestring和Unicode字符串之间的区别,请务必阅读。

仅当主目录的路径在filesystemencoding中实际可表达时,才能使用filesystemencoding将bytestring解码为Unicode

在Windows上,用于字节字符串文件路径I/O的filesystemencoding是与区域设置相关的“ANSI代码页”,不幸的是,它从来不是UTF,因此字节字符串文件路径函数中始终存在无法表示的字符。因此,例如,如果用户名包含一个日语字符,但它是西欧Windows安装(使用代码页1252,类似于ISo-8859-1),Martijn的示例将失败

在大多数使用基于C标准库字节字符串的文件I/O函数的语言中,情况就到此为止:在Java等语言中,您无法访问名称中包含ANSI代码页以外字符的文件

幸运的是,Python特别支持Windows的Unicode文件名,使用本机Win32 API调用而不是C标准库。使用这些文件,您可以按照Windows的理解获得真正的Unicode文件名,避免在将其转换为字节字符串并返回时出现有损的损坏

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

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

print os.path.expanduser(“~”)
似乎可以按预期工作。记住,解释器使用
repr
来显示结果。@Eric:OP指的是
\xe2
字符,不是双重的
\\
反斜杠。@MartijnPieters:这是同一件事的另一面-
repr
生成创建字符串所需的python文本。@Eric:但它不是Unicode字符串,而是由TestRing编码的拉丁-1。OP想知道如何把它变成Unicode字符串。@埃里克:当然,可能是OP不理解Unicode和编码字节字符串之间的区别,所以我用Joel Spolksy关于这个主题的帖子的链接更新了答案。