2

我有一个 python sgi 脚本,它尝试提取发布到它的 rss 项目并将 rss 存储在 sqlite3 db 中。我使用 Flup 作为 WSGIServer。
获取发布内容: postData = environ["wsgi.input"].read(int(environ["CONTENT_LENGTH"]))

要尝试存储在数据库中:

from pysqlite2 import dbapi2 as sqlite
ldb = sqlite.connect("/var/vhost/mysite.com/db/rssharvested.db")
lcursor = ldb.cursor()
lcursor.execute("INSERT into rss(data) VALUES(?)", (postData,))

这导致只有 rss 的前几个字符存储在记录中:ÿþ< 我相信初始字符是 rss 的 BOM。

我已经尝试了我能想到的所有排列,包括首先将 rss 编码为 utf-8,然后尝试存储,但结果是相同的。我无法解码,因为某些字符无法表示为 unicode。

运行 python 2.5.2 sqlite 3.5.7

提前感谢您对此问题的任何见解。


这是 postData 中包含的初始数据示例,由 repr 函数修改,写入文件并使用 less 查看:

'\xef\xbb\xbf

谢谢大家的回复!很有帮助。


我提交的示例没有通过stackoverflow html过滤器将再次尝试,将小于和大于转换为实体(预览表明这有效)。

\xef\xbb\xbf<?xml version="1.0" encoding="utf-16"?><rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd= "http://www.w3.org/2001/XMLSchema"><channel><item d3p1:size="0" xsi:type="tFileItem" xmlns:d3p1="http://htinc.com/opensearch- ex/1.0/">

4

3 回答 3

1

关于插入编码 - 在任何体面的数据库 API 中,您应该只插入unicode字符串和unicode字符串。

对于阅读和解析位,我推荐 Mark Pilgrim 的Feed Parser。它可以正确处理 BOM,并且许可证允许商业用途。 如果您不对 RSS 数据进行任何实际解析,这可能有点过于繁琐。

于 2009-01-19T14:04:45.390 回答
1

您确定您的传入数据被编码为 UTF-16(也称为 UCS-2)吗?

UTF-16 编码的 unicode 字符串通常包含大量 NUL 字符(当然也适用于 ASCII 中存在的所有字符),因此 UTF-16 数据几乎不能存储在环境变量中(POSIX 中的 env vars 是 NUL 终止的)。

请提供postData变量内容的样本。使用 输出它们repr()

在那之前,可靠的建议是:在所有 DB 交互中,Python 端的字符串应该是 unicode 字符串;数据库接口应该处理所有必要的翻译/编码/解码。

于 2009-01-19T18:34:14.470 回答
0

在插入 SQL 之前,您应该将字符串转换为 unicode 兼容的字符串。如果引发 UnicodeError 异常,则对 string.encode("utf-8") 进行编码。

或者,您可以在他的编码模式上自动检测编码并对其进行编码。 自动检测编码

于 2009-01-19T14:36:03.487 回答