Python编码问题(unicode)

时间:2011-07-15 18:20:54

标签: python unicode encoding character-encoding

在扔番茄之前,让我解释一下我的问题(我先读过python unicode doc)。

我使用json模块将json格式的结果解析为字典。这给了我unicode编码的字符串(例如:u“My string t \ xf4t”)。然后我用Mysqldb将这个字符串存储在我的Mysql数据库中。我确切地说这些数据库是为utf8配置的。

然后我检索我的Mysql记录,仍然使用MysqlDB。现在打印的结果看起来像“我的字符串t \ xf4t”(没有你)。 因为我需要比较插入和检索的字符串,我必须告诉python我的检索字符串是unicoded。

无论我尝试什么,我都有一个UnicodeDecodeError。我尝试使用编码:unicode(storedInDB,“utf_8”)和错误参数(“替换”)。但我仍然有例外。

你有提示吗?

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

u"My string t\xf4t"是一个Unicode字符串(其类型为unicode),但"My string t\xf4t"是一个字节字符串(其类型为str)。

unicode(storedInDB, "utf_8")尝试将字节字符串解码为UTF-8,但"My string t\xf4t"无效UTF-8。

答案 1 :(得分:1)

虽然您为UTF-8配置了MySql,但实际上并没有将UTF-8数据写入其中。在发送字符串之前,您必须从Unicode编码为UTF-8。

答案 2 :(得分:1)

您最有可能的做法是将charset='utf8'添加到MySQLdb.connect()来电。

对于MySQL本身,字符集在许多不同的上下文中单独设置 - 最值得注意的是,对于表存储和连接(并且遗憾的是,在许多情况下,MySQL似乎仍然默认为latin-1)。因此,您可以 - 例如 - 解决将整个数据库设置为使用UTF-8的问题:

CREATE DATABASE somedatabase DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;

然而,当您连接客户端时,MySQL可能仍然认为您正在使用其他编码与其进行通信:

mysql> show variables like 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

对此的基本解决方案是在连接之前立即执行SET NAMES UTF8,然后再执行其他操作:

mysql> SET NAMES UTF8;
mysql> show variables like 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

但是,在你的情况下,这仍然是不够的,因为python MySQLdb模块本身也想要帮助并自动编码/解码python的本机unicode字符串。因此,您必须在MySQLdb中设置字符集。如前所述,最好通过在创建MySQLdb连接时传递charset='utf8'来完成此操作。 (这也会导致MySQLdb通知mysql服务器你的连接正在使用UTF8,因此你不需要直接运行SET NAMES UTF8