2013-08-23 101 views
5

在Python 2.7版我有這樣的:的UnicodeDecodeError: 'UTF-8' 編解碼器不能解碼字節 「0xc3」

# -*- coding: utf-8 -*- 
from nltk.corpus import abc 
with open("abc.txt","w") as f: 
    f.write(" ".join(i.words())) 

我再試試這個文檔中在Python 3閱讀:

with open("abc.txt", 'r', encoding='utf-8') as f: 
    f.read() 

只能得到:

File "C:\Python32\lib\codecs.py", line 300, in decode 
    (result, consumed) = self._buffer_decode(data, self.errors, final) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0xc3 in position 633096: invalid continuation byte 

我做錯了什麼? Notepad ++似乎表明該文檔是Unicode utf-8。即使我嘗試用Notepad ++將文檔轉換爲這種格式,我仍然在python 3中得到這個錯誤,這很奇怪,因爲我讀了很多其他的utf-8編碼文檔沒有任何問題。

+0

「od」對該位置周圍的角色說了什麼? –

回答

3

我的猜測是您的輸入編碼爲ISO-8859-2,其中包含Ă,編號爲0xC3。檢查輸入文件的編碼。

+0

記事本++說,該文件編碼爲UTF8沒有BOM – Baz

+8

@Baz記事本++可以猜錯。有*沒有*可靠的方式來猜測編碼。每個程序有時會猜錯編碼,這就是爲什麼你應該總是知道文件的編碼。嘗試重寫編碼爲utf-8的文件(例如,使用'codecs.open'而不是'open')。 – Bakuriu

2

基於你的Python 2.7中沒有拋出異常的事實,我推斷i.words()返回一串字節串。這些不太可能以UTF8編碼 - 我猜可能是Latin-1或類似的東西。然後您將它們寫入文件。此時不會發生編碼。

您可能需要將它們轉換爲unicode字符串,您需要知道它們的現有編碼,然後在編寫文件時需要將它們編碼爲UTF-8。

例如:

# -*- coding: utf-8 -*- 
from nltk.corpus import abc 
import codecs 
with codecs.open("abc.txt","w","utf-8") as f: 
    f.write(u" ".join(codecs.decode(word,"latin-1") for word in i.words())) 

一些進一步注意到,萬一有任何混亂:

  • -*- coding: utf-8 -*-線是指用來寫Python腳本本身的編碼。它對該腳本的輸入或輸出沒有影響。
  • 在Python 2.7中,有兩種字符串:字節串(bytestrings),它是帶有未指定編碼的字節序列,以及unicode字符串,它們是unicode代碼點的序列。字節串是最常見的,並且如果您使用常規的​​字符串字面值語法,您將得到什麼結果。 Unicode字符串是您在使用u"abc"語法時獲得的。
  • 在Python 2.7中,如果您只是使用open函數打開文件並向其寫入字節串,則不會發生編碼。字節串的字節直接寫入文件。如果您嘗試將unicode字符串寫入該字符串,那麼如果它們包含無法使用默認(ASCII)編碼解碼器編碼的字符,則會發生異常。
相關問題