2009-01-19 54 views
1

我有尝试撷取发布到它的RSS项目和RSS存储在sqlite3的分贝一个python脚本SGI存储一个UTF-16编码RSS流进的sqlite3的正确步骤。我使用flup作为WSGIServer。
为了获得发布的内容: POSTDATA = ENVIRON [ “wsgi.input”]读取(INT(ENVIRON [ “CONTENT_LENGTH”]))什么是使用python

要尝试在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的只有前几个字符被存储在记录: 云天化< 我相信最初的字符是RSS的BOM。

我都想尽排列我能想到的,包括第一次编码的RSS为UTF-8,然后试图保存,但结果是一样的。我无法解码,因为某些字符不能表示为unicode。

执行Python 2.5.2 源码提前3.5.7

感谢任何洞察到这一问题。


这里是包含在POSTDATA初始数据的一个样本通过repr函数作为修改,写入文件和观看具有较少:

“\ XEF \ XBB \ XBF

由于为所有的答复!很有帮助。


我提交没有做它通过计算器HTML过滤器会再次尝试,转换比实体更小和更大的(预览显示这个工程)的样品。

\ XEF \ XBB \ XBF <?XML版本= “1.0” 编码= “UTF-16”? > < rss xmlns:xsi =“http://www.w3.org/2001/XMLSchema-instance”xmlns:xsd =“http://www.w3.org/2001/XMLSchema”> <频道> <项目d3p1 :size =“0”xsi:type =“tFileItem”xmlns:d3p1 =“http://htinc.com/opensearch-ex/1.0/”>

回答

0

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

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

1

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

对于阅读和分析一下,我建议Mark Pilgrim的Feed Parser。它可以正确处理物料清单,许可证允许商业使用。 如果你没有对RSS数据进行任何实际的解析,这可能有点过分。

1

你确定你输入的数据编码为UTF-16(也称为UCS-2)?因此UTF-16数据几乎不能存储在环境变量中(POSIX中的环境变量NUL终止)。UTF-16编码的unicode字符串通常包含大量的NUL字符(当然也适用于ASCII中存在的所有字符)。

请提供postData变量内容的样本。使用repr()输出它们。在此之前,可靠的建议是:在所有数据库交互中,Python端的字符串应该是unicode字符串;数据库接口应负责所有必要的翻译/编码/解码。

+0

注意:UCS-2在几点上与UTF-16截然不同。 -----特别是:a)UCS-2不能表示任何可能的Unicode字符,如UTF-16 can --- b)UCS-2中的字符全部为2个字节,而UTF-16字符串中的字符可能更长(代理对)。 – Deestan 2009-01-19 23:25:17