2016-02-11 65 views
1

我使用Python的庫MySQLdb來訪問包含葡萄牙語條目的數據庫,並帶有一串重音符號,然後使用xlsxwriter將其保存到Excel文件中。當我關閉工作簿保存它,我得到以下錯誤:python上的MySQLdb查詢結果的編碼問題

UnicodeDecodeError: 'utf8' codec can't decode byte 0xed in position 59: invalid continuation byte 

它在抱怨的結果是:

u'QNO XX Conjunto YY, No. Casa ZZ, CEP: AAAAAAAA, Bras\xedlia /DF' 

具體而言,它應該是Brasília,而不是Bras\xedlia。我怎樣才能讓輸出以更友好的方式進行編碼?我是否需要分別替換\xed之類的每個可能的口音?

- 編輯:

我知道0xED是latin-1iso-8859-1í,鑑於語言(和信息從負責該數據庫的人),我認爲這是正確的編碼。如何將一個字符串變成'Bras\xedlia'變成一個總體上變爲'Brasília'的字符串,知道這一點?

- 編輯:

如果我嘗試使用str(that thing)我所得到的是

'ascii' codec can't encode character u'\xed' in position 52: ordinal not in range(128) 
+0

您可以指示MySQL通過SET NAMES'UTF8''查詢將結果轉換爲utf-8。 [更多信息](http://dev.mysql.com/doc/refman/5.7/en/charset-connection.html)。 – Kenney

+0

您的文本不是UTF8編碼,它看起來更像是一個iso-8859-x變體。您應該確定編碼並將其作爲'charset'參數傳遞給'connect()',或者在字符串上執行顯式的decode()。 –

+0

我已經嘗試了幾個字符串的顯式解碼,並且'\ xed'仍然存在,或者被某種其他類型的'\ x'-something取代,從來沒有被實際的口音取代。傳遞一個字符集參數給了我'不能初始化字符集'。 –

回答

0

這聽起來像xlswriter,而不是Python或MySQL的問題。

0xED表示進入的字節是latin1,而不是utf8,而不是ascii。如果你堅持使用0xED,那麼請執行SET NAMES latin1,以便python能夠與MySQL正確通信。無論表格/列是CHARACTER SET latin1還是utf8,SET NAMES都會導致在INSERT/SELECT/etc中發生適當的轉換(如果有的話)。

0

你需要改變你的田地,你的表的字符集。

這麼做運行下列之一:

mysql> ALTER TABLE <table> CONVERT <col> VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci;23

OR

mysql> ALTER TABLE <table> MODIFY <col> VARCHAR(50) CHARACTER SET utf8;23

我寧願第一個。

最後,正如克勞斯D.說你需要與charset="utf8"連接到MySQL,檢查link