2015-10-14 159 views
0

我有一個包含'®'字符的Windows-1252編碼輸入文件。我需要將此字符寫入UTF-8文件。還假設我必須使用Python 2.7。看起來很簡單,但我不斷收到UnicodeDecodeErrors。如何從Windows-1252文件中讀取®字符並寫入UTF-8文件

我原本只是打開使用codecs.open()使用UTF-8編碼,它工作得很好了所有的ASCII字符,直到它遇到®符號,於是它用錯誤哽咽原始文件:

UnicodeDecodeError: 'utf8' codec can't decode byte 0xae in position 2867043: 
invalid start byte 

我知道我必須正確解碼它作爲cp1252來解決這個問題,所以我打開它以適當的編碼,然後在寫入之前將數據編碼爲UTF-8。但是,這產生了新的錯誤:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 22: 
ordinal not in range(128) 

這裏是一個最低工作例如:

with codecs.open('in.txt', mode='rb', encoding='cp1252') as inf: 
    with codecs.open('out.txt', mode='wb', encoding='utf-8') as of: 
     for line in inf: 
      of.write(line.encode('utf-8')) 

這裏是in.txt內容:

Sample file 

Here is my sample file® yay. 

我想也許我可以打開它在'rb'模式中沒有指定編碼,並且具體處理每條線的解碼和編碼,如下所示:

of.write(line.decode('cp1252').encode('utf-8')) 

但這也不起作用,給出與我剛剛打開UTF-8時相同的錯誤。

如何從Windows-1252文件讀取數據,正確解碼並將其編碼爲UTF-8並將其寫入UTF-8文件?上述方法在過去一直爲我工作,直到我遇到了®角色。

回答

1

如果0xC2應代表®字符,則您的文件不在Windows-1252中;在Windows-1252中,0xC2是Â

然而,你應該只使用

of.write(line) 

,因爲正確的編碼是你首先使用codecs的全部理由。

+0

這解決了這個問題,但你能幫助我更好地理解一點。編解碼器以某種方式處理我的編碼?附:我會接受這一點,但它不會讓我多幾分鐘。 –

+0

@BobDylan:是的,在飛行中進行en /解碼是編解碼器包的**作業**。閱讀文檔! –

+0

是的,我嘗試瞭解更多,但文檔似乎只記錄所有的方法。關於它是如何工作的並沒有真正的(低級別)描述。如果你有任何解釋它的鏈接,而不僅僅是列出所有的方法,並簡要描述他們做什麼,但不知道它們是如何工作的,我想了解更多。沒有biggie,如果沒有,這是我接受的答案,我很欣賞你的時間。 –

相關問題