簡體   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