使用python将utf-16编码的rss流存储到sqlite3的正确步骤是什么?

时间:2009-01-19 13:57:37

标签: python sqlite wsgi

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

尝试存储在db:

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的前几个字符存储在记录中: YTH< 我相信最初的字符是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 /“>

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

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

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