Чтение юникода из sqlite db с использованием python - PullRequest
1 голос
/ 05 февраля 2012

Данные, хранящиеся в юникоде (в базе данных), должны быть извлечены и преобразованы в другую форму.

Следующий фрагмент

def convert(content):
    content = content.replace("ஜௌ", "n\[s");
    return content;

mydatabase = "database.db"
connection = sqlite3.connect(mydatabase)
cursor = connection.cursor()
query = ''' select unicode_data from table1'''
cursor.execute(query)
for row in cursor.fetchone():
    print convert(row)

выдает следующее сообщение об ошибке в методе конвертирования.

exceptions.UnicodeDecodeError: кодек «ascii» не может декодировать байт 0xe0 в позиция 0: порядковый номер вне диапазона (128)

Если содержимое базы данных равно "ஜௌஜௌஜௌ" , вывод должен быть "n \ [sn \ [sn \ [s"

В документации предлагается использовать игнорирование или замену, чтобы избежать ошибки при создании строки Unicode.

когда итерация изменяется следующим образом:

for row in cursor.fetchone():
    print convert(unicode(row, errors='replace'))

возвращает

exceptions.TypeError: декодирование Unicode не поддерживается

, который сообщает, что строка уже является Unicode.

Любой свет, чтобы заставить его работать, высоко ценится. Заранее спасибо.

1 Ответ

2 голосов
/ 05 февраля 2012
content = content.replace("ஜௌ", "n\[s");

Предложите, что вы имеете в виду:

content = content.replace(u'ஜௌ', ur'n\[s');

или в целях безопасности, когда кодировка вашего файла неясна:

content = content.replace(u'\u0B9C\u0BCC', ur'n\[s');

Содержимое, которое у вас уже есть, является Unicode, поэтому выдолжен сделать замену строки Unicode на нем."ஜௌ" без u - это строка байтов, которая представляет эти символы в некоторой кодировке в зависимости от кодировки вашего исходного файла.(Строки байтов работают гладко вместе со строками Unicode только в самых однозначных случаях, что касается символов ASCII.)

(строка r означает, что вам не нужно беспокоиться о включении открытых обратных косых черт.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...