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

StackOverflow https://stackoverflow.com/questions/457641

  •  19-08-2019
  •  | 
  •  

Вопрос

У меня есть скрипт 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 должны быть строками в юникоде;интерфейс базы данных должен позаботиться обо всех необходимых переводах / кодировках / декодированиях.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top