Какова правильная процедура для сохранения rss-потока в кодировке utf-16 в sqlite3 с использованием python
Вопрос
У меня есть скрипт python sgi, который пытается извлечь rss-элементы, отправленные в него, и сохранить rss в базе данных sqlite3.Я использую flup в качестве WSGIServer.
Чтобы получить размещенный контент:postData = окружающая среда["wsgi.input"].read(int(окружающая среда["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, а затем попытку сохранения, но результаты были теми же.Я не смог расшифровать, потому что некоторые символы не могли быть представлены в формате unicode.
Запуск python 2.5.2 sqlite 3.5.7
Заранее спасибо за любое понимание этой проблемы.
Вот пример исходных данных, содержащихся в postData, измененных функцией repr, записанных в файл и просмотренных с меньшим:
'\xef\xbb\xbf
Спасибо за все ответы!Очень полезно.
Образец, который я отправил, не прошел через фильтры stackoverflow html, попробую еще раз, преобразовав less и greater than в entities (предварительный просмотр показывает, что это работает).
\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/">
Решение
Перед вставкой SQL вам следует преобразовать строку в строки, совместимые с unicode.Если вы вызываете исключение UnicodeError, то закодируйте строку.encode("utf-8").
Или вы можете автоматически определить кодировку и закодировать ее в соответствии с его схемой кодирования. Автоматическое определение кодировки
Другие советы
Что касается кодировки вставки - в любом приличном API базы данных вы должны вставить unicode
струны и unicode
только строки.
Для чтения и синтаксического анализа я бы порекомендовал книгу Марка Пилигрима Анализатор каналов.Он должным образом обрабатывает спецификацию, а лицензия разрешает коммерческое использование. Это может быть немного чересчур сложно, если вы не выполняете никакого фактического анализа данных RSS.
Вы уверены, что ваши входящие данные закодированы как UTF-16 (иначе известный как UCS-2)?
Строки unicode в кодировке UTF-16 обычно содержат множество символов NUL (разумеется, и для всех символов, существующих в ASCII), поэтому данные UTF-16 вряд ли могут храниться в переменных окружения (переменные env в POSIX завершаются NUL).
Пожалуйста, предоставьте образцы postData
переменное содержимое.Выводите их с помощью repr()
.
До тех пор убедительный совет заключается в следующем:во всех взаимодействиях с БД ваши строки на стороне Python должны быть строками в юникоде;интерфейс базы данных должен позаботиться обо всех необходимых переводах / кодировках / декодированиях.