2015-09-05 110 views
3

我正在使用Python 3.4編寫一個unicode字符串到文件。 寫完文件後,如果我打開並查看,它完全是一組不同的字符。python unicode:寫入文件時,以不同的格式寫入

CODE: -

# -*- coding: utf-8 -*- 

with open('test.txt', 'w', encoding='utf-8') as f: 
    name = 'أبيض' 
    name.encode("utf-8") 
    f.write(name) 
    f.close()  

f = open('test.txt','r') 
for line in f.readlines(): 
    print(line) 

OUTPUT: -

أبيض 

在此先感謝

回答

4

你需要指定的編解碼器時閱讀以及使用方法:

f = open('test.txt','r', encoding='utf8') 
for line in f.readlines(): 
    print(line) 

否則使用您的系統默認值;看到open() function documentation

編碼是用於解碼或編碼所述文件的編碼的名稱。這隻能用於文本模式。默認編碼依賴於平臺(無論locale.getpreferredencoding()是否返回),但可以使用Python支持的任何編碼。

由你得到的輸出來看,系統正在使用Windows Codepage 1252作爲默認:

>>> 'أبيض'.encode('utf8').decode('cp1252') 
'أبيض' 

通過使用讀錯時編解碼器,你創造了什麼叫做Mojibake

請注意,您書寫示例中的name.encode('utf8')行完全是多餘的;該調用的返回值將被忽略,並且這是調用實際編碼的f.write(name)f.close()調用也完全是多餘的,因爲with語句已經關閉了您的文件。下面將產生正確的輸出:

with open('test.txt', 'w', encoding='utf-8') as f: 
    name = 'أبيض' 
    f.write(name) 

with open('test.txt', 'r', encoding='utf-8') as f: 
    for line in f.readlines(): 
     print(line) 
+0

效果很好,謝謝,謝謝你的什麼是實際發生的好的解釋.. –

+0

@remisharoon:什麼馬亭說一下以防萬一你沒有完全得到在你的代碼中使用'name.encode(「utf-8」)'這個調用_doesn't_ modify'name':它創建一個包含'name'的utf-8編碼版本的新的字節串對象,但是你不會把'name.encode(「utf-8」)'賦值給任何剛剛被刪除的新字符串。 –