2012-11-07 79 views
0

我在葡萄牙的用戶計算機上運行python程序,用戶的用戶名包含unicode字符。我想有os.path.expanduser('~')回報功能的東西,因爲我用的是得到的路徑對一些文件的操作,但它目前返回一個Python的Unicode字符串str表示:如何將一個unicode字符串的str表示轉換爲unicode?

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

但是,這是一個Python字符串...如何我可以將其轉換爲Windows將識別爲有效文件路徑的實際unicode字符串嗎?

+0

'print os.path.expanduser('〜')'似乎按照您的預期工作。記住,解釋器使用'repr'來顯示結果。 – Eric

+0

@Eric:這是OP所指的'\ xe2'字符,而不是加倍的'''''''反斜槓。 –

+0

@MartijnPieters:這是同一事物的另一面 - 'repr'產生創建字符串所需的python文字。 – Eric

回答

7

該函數返回一個字節字符串,而不是一個unicode字符串。給定用於字符串的編碼,您需要解碼它。

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

我在這裏作出推定,即使用的編碼是文件系統的編碼,這是通過sys.getfilesystemencoding()即時拍攝。它從這裏看起來像拉丁語-1,但你不能確定。

您也可以嘗試在unicode的傳遞路徑os.path.expanduser()和安裝Python做解碼爲您提供:

os.path.expanduser(u'~') 

請在Python Unicode HOWTO這個問題和其他問題的Unicode讀了。如果您不理解編碼的字符串和Unicode字符串之間的差異,請閱讀this excellent article

1

只有在主目錄的路徑實際上可以在文件系統編碼中表達時,才能將filestring解碼爲Unicode與文件系統編碼。

在Windows上,用於字節字符串文件路徑I/O的文件系統編碼是依賴於語言環境的'ANSI代碼頁',不幸的是,它從來不是UTF,因此總是有字符用byte-string-file-path函數表示。例如,如果用戶名包含日文字符,但它是西歐Windows安裝(使用代碼頁1252,類似於ISo-8859-1),Martijn的例子會失敗。

在大多數使用C標準庫基於字節字符串的文件I/O函數的語言中,這就是它的結尾:在Java等中,您無法訪問名稱中包含ANSI代碼外的字符的文件頁。

幸運的是,Python對Windows的Unicode文件名具有特定的支持,使用本機Win32 API調用而不是C標準庫。使用這些,你可以得到真正的Unicode文件名,因爲Windows可以理解它,避免了在將它轉換爲字節字符串並返回時涉及有損的混亂。

通常情況下,您只需將Unicode字符串傳遞到您要調用的函數中,即可在Python 2中觸發Unicode文件名支持。 Python將返回Unicode字符串作爲響應:

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