使用Python将UTF-16编码的RSS流存储到SQLite3的正确程序是什么?

2024-06-13 09:19:44 发布

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

我有一个pythonsgi脚本,它试图提取发布到它的rss项目,并将rss存储在sqlite3db中。我正在使用flup作为WSGIServer。
获取发布内容: postData=环境[“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表示。在

运行python2.5.2 sqlite 3.5.7

提前感谢您对这个问题的深入了解。在


以下是postData中包含的初始数据的示例,这些数据由repr函数修改,写入文件并用更少的时间查看:

'\xef\xbb\xbf

谢谢你的回复!很有帮助。在


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

\xef\xbb\xbf<;?xml version=“1.0”encoding=“utf-16”?&>lt;rssxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema“>;<;频道>;<;项目d3p1:size=”0”xsi:类型=“tFileItem”XML编号:d3p1="http://htinc.com/opensearch ex/1.0/“>


Tags: 数据项目ltgtcomhttp示例db
4条回答

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

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

请提供postData变量内容的示例。使用repr()输出它们。在

在此之前,最可靠的建议是:在所有的DB交互中,Python端的字符串应该是unicode字符串;DB接口应该负责所有必要的翻译/编码/编码。在

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

对于阅读和解析部分,我推荐markpilgrim的Feed Parser。它正确地处理BOM,并且许可证允许商业使用。如果没有对RSS数据进行任何实际的解析,这可能有点过于繁重。

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

或者,你可以根据他的编码模式自动检测编码并对其进行编码。Auto detect encoding

相关问题 更多 >