Каква е правилната процедура за съхраняване на utf-16 кодиран rss поток в sqlite3 с помощта на python

Имам sgi скрипт на python, който се опитва да извлече 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 се съхраняват в записа: ÿþ‹ Вярвам, че първоначалните знаци са BOM на rss.

Опитах всяка пермутация, за която можех да се сетя, включително първо кодиране на rss като utf-8 и след това опит за съхраняване, но резултатите бяха същите. Не можах да декодирам, защото някои знаци не можаха да бъдат представени като уникод.

Стартиране на python 2.5.2 sqlite 3.5.7

Благодаря предварително за всяко вникване в този проблем.


Ето извадка от първоначалните данни, съдържащи се в postData, модифицирани от функцията repr, записани във файл и прегледани с по-малко:

'\xef\xbb\xbf

Благодаря за всички отговори! Много полезно.


Извадката, която изпратих, не успя да премине през html филтрите на stackoverflow, ще опита отново, конвертирайки по-малко и по-голямо от в обекти (прегледът показва, че това работи).

\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/"›


person jon    schedule 19.01.2009    source източник


Отговори (3)


Преди вмъкването на SQL трябва да конвертирате низа в низове, съвместими с unicode. Ако повдигнете изключение UnicodeError, тогава кодирайте string.encode("utf-8").

Или можете автоматично да откриете кодирането и да го кодирате в неговата схема за кодиране. Автоматично откриване на кодиране

person Jorge Niedbalski R.    schedule 19.01.2009

По отношение на кодирането за вмъкване - във всеки приличен API на база данни трябва да вмъквате само unicode низове и unicode низове.

За малкото четене и анализиране бих препоръчал Feed Parser на Марк Пилгрим. Той правилно обработва BOM и лицензът позволява търговска употреба. Това може да е твърде тежко, ако не правите реален анализ на RSS данните.

person Deestan    schedule 19.01.2009

Сигурни ли сте, че входящите ви данни са кодирани като UTF-16 (известен още като UCS-2)?

UTF-16 кодирани Unicode низове обикновено включват много NUL символи (със сигурност и за всички символи, съществуващи в ASCII също), така че UTF-16 данни едва ли могат да се съхраняват в променливи на средата (env vars в POSIX са NUL терминирани).

Моля, предоставете образци на съдържанието на променливата postData. Изведете ги с помощта на repr().

Дотогава солидният съвет е: във всички взаимодействия с DB, вашите низове от страна на Python трябва да бъдат низове в Unicode; интерфейсът на DB трябва да се грижи за всички необходими преводи/кодирания/декодирания.

person tzot    schedule 19.01.2009
comment
Забележка: UCS-2 е критично различен от UTF-16 в няколко точки. ----- По-конкретно: a) UCS-2 не може да представлява всеки възможен Unicode знак, както UTF-16 може --- b) знаците в UCS-2 са с дължина 2 байта, докато знаците в низ UTF-16 може да са по-дълги (сурогатни двойки). - person Deestan; 20.01.2009