2009-01-19 69 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