Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python编码问题(unicode)_Python_Unicode_Encoding_Character Encoding - Fatal编程技术网

Python编码问题(unicode)

Python编码问题(unicode),python,unicode,encoding,character-encoding,Python,Unicode,Encoding,Character Encoding,在扔西红柿之前,让我解释一下我的问题(我先阅读了python unicode文档) 我使用json模块将json格式的结果解析为字典。这将为我提供unicode编码的字符串(例如:u“My string t\xf4t”)。然后我使用Mysqldb将这个字符串存储在Mysql数据库中。我确定这些数据库是为utf8配置的 然后我检索我的Mysql记录,仍然使用MysqlDB。现在打印的结果看起来像“my string t\xf4t”(不带u)。 由于我需要比较插入的字符串和检索到的字符串,我必须告诉

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

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

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

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

你有什么提示吗

谢谢你的帮助

u“我的字符串t\xf4t”
是一个Unicode字符串(它的类型是
Unicode
),但是
“我的字符串t\xf4t”
是一个ByTestString(它的类型是
str


unicode(storedInDB,“utf_8”)
尝试将bytestring解码为utf-8,但是
“我的字符串t\xf4t”
不是有效的utf-8。

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

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

对于MySQL本身,字符集是在许多不同的上下文中分别设置的——最明显的是,对于表存储和连接(不幸的是,MySQL在许多情况下似乎仍然默认为拉丁语-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/ |
+--------------------------+----------------------------+
解决此问题的一个基本方法是在连接后立即执行
设置名称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,因此您不需要直接运行
设置名称UTF8

您是否调用
MySQLdb.connect
with
use_unicode=True
?我忘了看这一点(几个月前我在java和jdbc上遇到过同样的问题…)。你解决它!哇,这比我想象的要复杂。在所有地方,默认为UTF-8需要多长时间?