我有一个 PHP 支持的网站,可以处理来自 JSON 的数据输入。 JSON 输入存储在数据库中,然后显示给用户。常规的东西......
现在我正在尝试使用 Python 脚本来处理添加类似数据,但我遇到了 Unicode 问题。即,Python 使用 MySQLdb
输入到数据库中的特殊字符不要在页面显示时立即出来(通过 PHP/HTML)。
这是一个例子:
JSON 来源:
© 2015
来自 PHP 插入的数据库中的数据:
© 2015
从 PHP 数据库插入到 Web 上的样子:
© 2015
来自 Python 的数据库中的数据插入
© 2015
- 它在 Python 数据库插入中在 Web 上的样子:
� 2015
MySQLdb
的通用代码( comment
是 <type 'unicode'>
和我遇到麻烦的地方):
db = MySQLdb.connect("localhost", "root", "pass", "database",
use_unicode=True, charset='utf8' )
dbc = db.cursor()
dbc.execute("INSERT INTO `marks` (`id`, `title`, `comment`) VALUES (NULL, %s, %s)",
[ title, comment ])
db.commit()
db.close()
在输出端,我使用的是 PHP DOMDocument以 HTML 格式加载和打印文本:
@$descriptionText->loadHTML( '<meta http-equiv="content-type" content="text/html; charset=utf-8">'.$mark['Mark']['comment'] );
echo $descriptionText->saveHTML();
因此,PHP 正在对数据库中的数据进行编码,以便它看起来很奇怪,但在编码为 HTML 时可以正确呈现。有什么方法可以在 Python 中复制此行为?
最佳答案
由于您尚未从支持 PHP 的网站生成任何代码,因此我们无法确定它是否正确处理 unicode,或者根本无法处理。如果来自 PHP 插入的数据库中的数据确实(如问题中所述)显示为 © 2015
(特别是 python 字符串 u'\xc2\xa9 2015'
,注意 u
将其表示为 unicode 字符串)然后您的 PHP 应用程序在插入时实际执行的是使用 utf-8
解码输入的 unicode 字符串编解码器然后在数据库中插入所有内容都编码为 ISO8859-1
(或 latin1
)。加载时,查询返回 latin1
PHP 应用程序使用 utf8
解码的字符串编解码器取回原始 unicode。
对于 Python 代码,因为一切都在 utf8
中完成没有 latin1
步骤,当 PHP 脚本尝试加载该数据时,它将尝试解码为字节 \xa9
,但失败了。是一个错误,PHP 将错误替换为 \ufffd
默认为 unicode 代码点。
要使您的 Python 插入与您的 PHP 网站兼容并作为测试以查看此推断是否正确,请尝试
dbc.execute("INSERT INTO `marks` (`id`, `title`, `comment`)"
"VALUES (NULL, %s, %s)", [
title.encode('utf8').decode('latin1'),
comment.encode('utf8').decode('latin1'),
])
这基本上将所有 unicode 转换为您的 PHP 应用程序期望的原始 latin1 代码点,因为正如我提到的,它可能假设所有表都是 utf8
由 latin1
表示的编码字符串字符集。
关于PHP 与 Python 处理存储在数据库中的 Unicode 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31847219/