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 期间发生合适的转换(如果有的话) =]/等等
我正在使用 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;
(
或
mysql> ALTER TABLE <table> MODIFY <col> VARCHAR(50) CHARACTER SET utf8;
(
我更喜欢第一个。
最后,正如 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 期间发生合适的转换(如果有的话) =]/等等