Python编码问题(unicode)

2024-05-14 09:06:58 发布

您现在位置:Python中文网/ 问答频道 /正文

在扔西红柿之前,让我解释一下我的问题(我首先阅读了pythonicode文档)。在

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

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

不管我怎么做,我都有一个独创性的错误。我尝试使用编码:unicode(storedInDB,“utf_8”)和错误param(“replace”)。但我还是有例外。在

你有什么提示吗?在

谢谢你的帮助!在


Tags: 模块字符串文档数据库json编码string字典
3条回答

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

unicode(storedInDB, "utf_8")试图将bytestring解码为UTF-8,但是"My string t\xf4t"不是有效的UTF-8。在

最有可能的是,您要做的是将charset='utf8'添加到MySQLdb.connect()调用中。在

对于MySQL本身,字符集是在许多不同的上下文中单独设置的——最明显的是,对于表存储和连接(不幸的是,MySQL在许多情况下似乎仍然默认为拉丁语-1)。因此,例如,您可以麻烦地将整个数据库设置为使用UTF-8:

CREATE DATABASE somedatabase DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;

然而,当你连接一个客户端时,MySQL可能仍然认为你在用其他编码与它通信:

^{pr2}$

一个基本的解决方案是在连接后立即执行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/ |
+             +              +

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

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

相关问题 更多 >

    热门问题