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

У меня есть скрипт python sgi, который пытается извлечь отправленные ему элементы rss и сохранить rss в базе данных sqlite3. Я использую flup в качестве WSGIServer.
Чтобы получить размещенный контент: postData = environ["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.

Я пробовал все перестановки, которые я мог придумать, включая сначала кодирование rss как utf-8, а затем попытку сохранения, но результаты были такими же. Я не мог декодировать, потому что некоторые символы не могли быть представлены как юникод.

Запуск питона 2.5.2 sqlite 3.5.7

Заранее благодарим за любое понимание этой проблемы.


Вот пример исходных данных, содержащихся в postData, измененных функцией repr, записанных в файл и просмотренных с помощью less:

'\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- экс/1.0/"›


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


Ответы (3)


Перед вставкой SQL вы должны преобразовать строку в строки, совместимые с юникодом. Если вы вызываете исключение UnicodeError, закодируйте string.encode("utf-8").

Или вы можете автоматически определить кодировку и закодировать ее в своей схеме кодирования. Автоопределение кодировки

person Jorge Niedbalski R.    schedule 19.01.2009

Что касается кодировки вставки - в любом приличном API базы данных вы должны вставлять только unicode строк и unicode строк.

Что касается чтения и синтаксического анализа, я бы порекомендовал анализатор каналов Марка Пилгрима. Он правильно обрабатывает спецификацию, а лицензия разрешает коммерческое использование. Это может быть слишком сложно, если вы не выполняете фактический анализ данных RSS.

person Deestan    schedule 19.01.2009

Вы уверены, что ваши входящие данные закодированы как UTF-16 (также известный как UCS-2)?

Строки Unicode в кодировке UTF-16 обычно включают множество символов NUL (конечно, для всех символов, существующих и в ASCII), поэтому данные UTF-16 вряд ли можно хранить в переменных среды (переменные env в POSIX завершаются NUL).

Предоставьте образцы содержимого переменной postData. Выведите их с помощью repr().

До тех пор твердый совет: во всех взаимодействиях с БД ваши строки на стороне Python должны быть строками Unicode; интерфейс БД должен позаботиться обо всех необходимых переводах/кодировании/декодировании.

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