Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.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 Mysql.connector将包含emojis的unicode API响应插入Mysql_Python_Unicode_Utf 8_Character Encoding_Ascii - Fatal编程技术网

使用Python Mysql.connector将包含emojis的unicode API响应插入Mysql

使用Python Mysql.connector将包含emojis的unicode API响应插入Mysql,python,unicode,utf-8,character-encoding,ascii,Python,Unicode,Utf 8,Character Encoding,Ascii,我使用Python连接到Facebook图形API,curl响应以Unicode格式提供大量数据。我试图使用python mysql.connector驱动程序将这些数据插入mysql数据库,但我一直遇到编码错误 具体来说,我得到了这种类型的错误: UnicodeDecodeError:“ascii”编解码器无法解码位置40:序号不在范围(128)中的字节0xc2 或 File“/Library/Python/2.7/site packages/mysql/connector/cursor_ce

我使用Python连接到Facebook图形API,curl响应以Unicode格式提供大量数据。我试图使用python mysql.connector驱动程序将这些数据插入mysql数据库,但我一直遇到编码错误

具体来说,我得到了这种类型的错误:

UnicodeDecodeError:“ascii”编解码器无法解码位置40:序号不在范围(128)中的字节0xc2


File“/Library/Python/2.7/site packages/mysql/connector/cursor_cext.py”,第243行,在执行raise errors.ProgrammingError(str(err))mysql.connector.errors.ProgrammingError:“ascii”编解码器无法对519位的字符u'\xa0'进行编码:序号不在范围(128)

我的数据库字段都是utf8mb4,我相信我的编码也都是UTF8。所以我不明白为什么会出现ASCII错误

错误发生在Instagram帖子返回的“标题”字段上,其中包括表情符号,因此我99%确定这就是问题所在,在评论这一行时,其他所有内容都按预期工作

到目前为止,我已经尝试:

在mysql.connector.connect命令中添加
use\u unicode=True,charset='utf8'
(根据文档,这是默认值)

添加
#/usr/bin/python#encoding=utf8
到脚本顶部

使用\u unicode=True,charset='ascii'
添加到mysql.connector.connect命令,因为为什么不试试呢

在mysql insert指令之前的变量上尝试了组合
caption.decode('utf')
caption.encode('utf8')

我在mysql.connector文档中找不到任何对ASCII的引用,所以我不确定它为什么要进行转换

关于上面的第二个错误,当转到mysql.connector包中的cursor_cext.py行时,这些行如下所示:

try:
    if isunicode(operation):
        stmt = operation.encode(self._cnx.python_charset)
    else:
        stmt = operation
except (UnicodeDecodeError, UnicodeEncodeError) as err:
    raise errors.ProgrammingError(str(err))

我以前使用老的Instagram API成功地对PHP进行了类似的操作,但现在他们已经改为Instagram的Facebook图形API,我决定使用Python,因为它看起来更简单,但现在我不知道如何处理这些错误

在Python2中组合Unicode和字节字符串时(例如,
“a”+u“a”
),在字节字符串(
“a”
)上有一个隐式强制调用
.decode()
)。在Python 2中,此方法的默认编解码器是ASCII

隐式强制期间发生的编码错误可能很难追踪。 隐式强制在Python3中消失了,因此用户代码和库代码都被强制保持
str
bytes
分开

如果可以,我建议您升级到Python 3。
这可能不会立即使您的代码正常工作,但您很可能会找到明确设置编码的位置。

谢谢您的解释和建议。我已经安装了3个,但一直拖延切换。如果我找不到合适的答案,我将重构解释器并将其更改为3。如果您因此对文本使用
unicode
,而对(二进制)数据使用
str
,您应该可以。问题是有些Python 2库有时不遵守这一原则。