2016-02-11 30 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