2011-08-04 87 views
14

我正在嘗試向文件中寫入一些字符串(字符串已由HTML解析器BeautifulSoup提供給我)。寫入文件時出現UnicodeEncodeError

我可以使用「打印」,以顯示他們,但是當我使用file.write()我收到以下錯誤:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xa3' in position 6: ordinal not in range(128) 

我如何解析呢?

回答

11

當您將包含非英文字符(超過128的Unicode字符)的Unicode字符串傳遞給需要ASCII字符串的內容時,會發生此錯誤。 Python字符串的默認編碼是ASCII,「它正好處理128個(英文)字符」。這就是爲什麼試圖將Unicode字符轉換爲128以上會產生錯誤。

Unicode的()

unicode(string[, encoding, errors]) 

構造具有簽名的unicode(字符串[,編碼,錯誤])。它的所有參數都應該是8位字符串。

第一個參數使用指定的編碼轉換爲Unicode; 如果離開關閉的編碼參數,該ASCII編碼用於轉化,所以字符大於127將作爲錯誤

例如待治療

s = u'La Pe\xf1a' 
print s.encode('latin-1') 

write(s.encode('latin-1')) 

將使用拉丁文-1編碼

+0

它的輸出字符串,如「123£」 – Rory

+0

這不是有效的ASCII價格。英鎊符號是字符代碼163,在ASCII範圍127之外。 –

+0

您必須指定一個可對這些字符進行編碼的編碼。文件不包含字符;它們包含字節。編碼將字符轉換爲字節。 –

17

是,大約99.9%o經驗豐富的Python用戶之前已經看到過。

如果我在Google中鍵入'python unicode',我會得到約1400萬個結果;第一個是http://docs.python.org/howto/unicode.html官方文件,描述了極端細節的整體情況;第四個是http://farmdev.com/talks/unicode/,這是一個更實用的概述,它將大大提供給你一個答案,並確保你明白髮生了什麼。

你真的需要閱讀和理解這些類型的概述,無論他們看起來如何。真的沒有任何東西可以繞過它。文字很難。沒有「純文本」這樣的東西,多年來一直沒有合理的傳真,而且從來沒有真正存在過,儘管我們花了幾十年時間假裝它。但是Unicode至少是一個標準。您也應該閱讀http://www.joelonsoftware.com/articles/Unicode.html

+0

感謝您的鏈接!非常有幫助 – tatlar

4

您的問題的答案是「使用編解碼器」。附加的代碼還顯示了一些gettext魔法,FWIW。 http://wiki.wxpython.org/Internationalization

import codecs 

import gettext 

localedir = './locale' 
langid = wx.LANGUAGE_DEFAULT # use OS default; or use LANGUAGE_JAPANESE, etc. 
domain = "MyApp"    
mylocale = wx.Locale(langid) 
mylocale.AddCatalogLookupPathPrefix(localedir) 
mylocale.AddCatalog(domain) 

translater = gettext.translation(domain, localedir, 
           [mylocale.GetCanonicalName()], fallback = True) 
translater.install(unicode = True) 

# translater.install() installs the gettext _() translater function into our namespace... 

msg = _("A message that gettext will translate, probably putting Unicode in here") 

# use codecs.open() to convert Unicode strings to UTF8 

Logfile = codecs.open(logfile_name, 'w', encoding='utf-8') 

Logfile.write(msg + '\n') 

儘管谷歌充滿命中在這個問題上,我發現它,而很難找到這種簡單的解決方案(它實際上是在有關Unicode Python文檔,而是安葬)。

所以... HTH ...

GAJ

+0

「簡單」?這也顯示出OP不關心的一大堆i18n機器 - 他不是在試圖確保人們看到正確語言的文本,他試圖從特定源文件中獲取特定語言的文本並將其放入文件中。所以你剪下的唯一相關部分是第一行和最後兩行,真的。至於「很難找到」,真的嗎?你爲什麼Google?我試過'UnicodeEncodeError:'ascii'編解碼器不能編碼字符';結果似乎很有幫助... –