繁体   English   中英

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

[英]How can I convert a str representation of a unicode string to unicode?

我正在葡萄牙的用户计算机上运行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())

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

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

os.path.expanduser(u'~')

请在Python Unicode HOWTO中阅读有关此和其他Unicode问题的信息。 如果您不了解编码的字节字符串和Unicode字符串之间的区别,请也阅读这篇出色的文章

仅当主目录的路径实际上在filesystemencoding中可表示时,才使用filesystemencoding将字节字符串解码为Unicode。

在Windows上,用于字节字符串文件路径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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM