2016-12-06 42 views
0

我得到一個特殊字符的UnicodeEncodeError書寫的文本文件:特殊字符UnicodeEncodeError寫作文本文件

File "D:\SOFT\Python3\lib\encodings\cp1252.py", line 19, in encode 
    return codecs.charmap_encode(input,self.errors,encoding_table)[0] 
UnicodeEncodeError: 'charmap' codec can't encode character '\ufffd' in position 956: character maps to <undefined> 

我的代碼:

expFile = open(expFilePath, 'w') 
# data var is what contains a special char 
expFile.write("\n\n" + data) 

的數據可能是一些奇怪的字符,從像Microsoft Word這樣的東西被粘貼到應用程序的HTML表單中,並被保存下來,現在我正在導入它。我甚至無法看到它,當我查詢它時,在我的數據庫編輯器中顯示爲菱形。它只是在文本編輯器中佔位符。輸入應該更嚴格地檢查字符集符合性,但事實並非如此。

有沒有辦法對數據進行編碼以使得任何字符可以被I/O處理消化?

或者,有沒有辦法檢查我的str是否符合文件IO期望的字符標準,以便替換違反它的任何數據?

+0

這並不重要,但'data'包含了什麼? –

+0

如果你真的想寫任意字節,試試用'b'作爲'open'的修飾符來切換到二進制模式。 – languitar

+0

這可能是某些來自Microsoft Word之類的奇怪的字符,它被粘貼到應用程序的HTML表單中並被處理,現在我正在導入它。我甚至無法看到它,當我查詢它時,在我的數據庫編輯器中顯示爲菱形。它只是在文本編輯器中佔位符。輸入應該更嚴格地檢查字符集的符合性,但它不是 – amphibient

回答

2

您的問題是,在Windows系統上以文本模式打開默認爲區域設置代碼頁cp1252,這是一個僅對Unicode範圍的一小部分進行編碼的ASCII超集。

要修復,請提供更全面的編碼,以支持整個Unicode範圍; open接受關鍵字參數覆蓋默認編碼,所以它的那樣簡單改變:

expFile = open(expFilePath, 'w') 

expFile = open(expFilePath, 'w', encoding='utf-8') 

根據您的需求,我會選擇要麼utf-8utf-16;前者對於大多數ASCII文本更爲緊湊,並且隨處可見,而後者與微軟用於存儲可移植(非本地語言相關)文本的典型編碼相匹配,因此可能會有幾個Windows特定的文本編輯器識別它/處理它更容易。