python 上 MySQLdb 查询结果的编码问题

Encoding problems from MySQLdb query result on python

我正在使用 Python 的库 MySQLdb 来访问包含葡萄牙语条目的数据库,带有一堆口音,然后我将其保存到 Excel 文件中使用xlsxwriter。当我关闭工作簿以保存它时,出现以下错误:

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-1 (iso-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)

您需要更改字段的字符集和 table。

这样做 运行 以下之一:

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

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

我更喜欢第一个。

最后,正如 Klaus D. 所说,您需要使用 charset="utf8" 连接到 mysql,检查 link

这听起来像是 xlswriter 的问题,而不是 python 或 MySQL。

0xED 表示传入的字节是 latin1,不是 utf8,也不是 ascii。如果你被 0xED 困住了,那么做 SET NAMES latin1 这样 python 就会与 MySQL 正确通信。 tables/columns 是 CHARACTER SET latin1 还是 utf8 并不重要,SET NAMES 将导致在 INSERT/[=16 期间发生合适的转换(如果有的话) =]/等等