【问题标题】:Python encoding problem (unicode)Python编码问题(unicode)
【发布时间】:2011-07-15 18:20:54
【问题描述】:

在扔西红柿之前,先解释一下我的问题(我先阅读了python unicode doc)。

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

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

无论我尝试什么,我都会遇到 UnicodeDecodeError。我尝试使用编码:unicode(storedInDB,“utf_8”)和错误参数(“replace”)。但我还是有例外。

你有提示吗?

感谢您的帮助!

【问题讨论】:

  • 你用use_unicode = True打电话给MySQLdb.connect吗?
  • 我忘了看这个(几个月前我在使用 java 和 jdbc 时遇到了同样的问题......)。你解决它!

标签: python unicode encoding character-encoding


【解决方案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

【讨论】:

  • 哇,这比我想象的要复杂。还要多久,所有地方的所有内容都默认为 UTF-8?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2013-09-10
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      • 2016-04-01
      • 2019-10-30
      • 2013-09-13
      • 2014-04-08
      • 2011-07-14
      相关资源
      最近更新 更多