2012-11-21 37 views
5

我得到這個錯誤:修復Python中的Unicode錯誤

f.write(textwrap.dedent(unicode(the_string)) 

我想寫的字符串是一個摘自:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 52-57: ordinal not in range(128)

導致錯誤的代碼一個包含英語和日語(用於測試)的網站音譯和外國人名字,例如電腦(konpyūta,「電腦」)和倫敦(Rondon,「倫敦」)的音譯。 (一些已歸化的外國借貸可能無法以片假名呈現。)

在Python中處理字符串時,使用另一種語言(日語)。我如何解析這個以防止錯誤並仍然保留字符串?

+2

的[Python的Unicode指南(http://docs.python.org/2/howto/unicode.html)可能會有所幫助。除此之外,請提供比此更詳細的代碼,輸入,完整回溯。 –

+0

導致錯誤的行:'f.write(textwrap.dedent(the_string))'。 (編輯主要問題) –

回答

4

這裏的問題是,文件對象的.write方法天真地試圖將unicode字符串轉換(如果你是在Python 2.x中,這將是unicode型的),您將它傳遞給一個字節字符串(如果你使用的是Python 2.x,這將是str類型)使用ASCII編解碼器,但是你傳遞的unicode字符串不能用ASCII表示,因爲它有(日文)字符不是ASCII字符集的一部分。

需要使用unicode字符串的.encode方法將其轉換爲表示該字符串的一系列字節,然後才能保存它。基本上,這是str類型在Python 2.x中表示的內容 - 只是一系列字節,而不是這是您可能期望的一系列字符。不過Python可以很容易地讓你思考,因爲當你的printstr類型的變量時,Python會使用系統默認的unicode編碼在終端中顯示它 - 作爲終端中的一系列字符。

你應該在這裏使用什麼編碼來編碼你的字符串取決於你的用例。 UTF-8是最常見的,你可能只是想使用它,但是如果你想確保你正在寫入的文件能夠在同一個系統上的文本編輯器中正確顯示,即使你在設備上運行它一個不太常見的編碼類似UTF-16的系統,你可能會想使用系統的默認編碼(如果系統有一個默認的編碼不能編碼你的字符串,這當然會失敗)。

換句話說,你幾乎可以肯定要做以下事情之一:

一)

f.write(textwrap.dedent(the_string).encode('utf-8'))

B)

import sys 
f.write(textwrap.dedent(the_string).encode(sys.getdefaultencoding())) 

,如果你認爲這是一個相當煩人和複雜的東西負載,讓你的頭來執行相當基本的任務,寫一些非ASCII文本到一個文件,然後 - 我同意你!當我開始使用Python - 這是我的第一個編程語言 - 我掙扎很多與理解的unicode,字符串編碼,並且涉及到它的Python類型和方法。然而,複雜性不Python的錯 - 這是下降到計算機編碼的文本,並明確一個事實,即有文字多重編碼的方式。 不同系列字節的可以代表相同一系列字符,這取決於正在使用的編碼。這使得它不可能爲Python只是對你隱瞞,螺母和字符串編碼的螺栓和「自動理智做事」像我,作爲一名新秀,天真地希望和預期會。

如果你將要編寫的涉及獲取和利用可能包含非ASCII字符的網站,我會圍繞這個話題徹底建議閱讀的文本數據和獲取它的一個堅實的理解代碼的任何顯著量,無論是從一般的還是Python的角度來看。

0

當與另一種語言(或編碼)的工作和寫作一個文件,我發現爲我工作的後綴字符串變量.encode。例如:

f.write(the_string.encode('utf-8'))