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

У меня есть сценарий Python SGI, который пытается извлечь отправленные в него элементы rss и сохранить их в базе данных sqlite3. Я использую flup в качестве WSGIServer.
Чтобы получить размещенный контент: postData = environment ["wsgi.input"]. read (int (environment ["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: YTH < Я считаю, что начальные символы являются спецификацией RSS.

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

Запуск Python 2.5.2 sqlite 3.5.7

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


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

'\ ХеР \ Xbb \ XBF

Спасибо за все ответы! Очень полезно.


Образец, который я отправил, не прошел через html-фильтры stackoverflow, попытается снова, преобразовав все меньше и больше, чем в сущности (предварительный просмотр показывает, что это работает).

\ xef \ xbb \ xbf <? Xml version = "1.0" encoding = "utf-16"?>

Ответы [ 3 ]

1 голос
/ 19 января 2009

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

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

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

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

1 голос
/ 19 января 2009

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

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

0 голосов
/ 19 января 2009

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

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

...