2016-06-29 2 views
0

У меня есть список переменных с символами Юникода, некоторые из них для химических веществ, таких как газ озона: например, «O \ u2083». Все они хранятся в базе данных sqlite, которая считывается в коде Python для получения O . Однако, когда я читаю, я получаю «O \\ u2083». База данных sqlite создается с использованием файла csv, который содержит строку 'O \ u2083' среди других. Я понимаю, что \ u2083 не хранится в базе данных sqlite как символ Unicode, а как 6 символов Unicode (которые будут \, u, 2,0,8,3). Есть ли способ распознавать символы Unicode в этом контексте? Теперь мой первый вариант решения этой задачи - создать функцию для распознавания набора символов и замены символов Unicode. Есть ли что-то подобное уже реализовано?Чтение символов Юникода из базы данных файла/sqlite и использования его в Python

ответ

1

Если у вас есть байтовая строка (длина 7), декодируйте escape-код Unicode.

>>> s = 'O\u2083' 
>>> len(s) 
7 
>>> s 
'O\\u2083' 
>>> print(s) 
O\u2083 
>>> u = s.decode('unicode-escape') 
>>> len(u) 
2 
>>> u 
u'O\u2083' 
>>> print(u) 
O₃ 

Оговорка: Консоль/IDE используется для печати символов необходимо использовать кодировку, которая поддерживает характер или вы получите UnicodeEncodeError при печати. Шрифт также должен поддерживать символ.

+0

Perfect !!!! Именно то, что мне нужно! Спасибо огромное! – awulll

+1

@awulll: в большинстве случаев '.decode ('unicode-escape')' указывает на ошибку в вашем коде (или вверх по потоку) - не использовать его - он фиксирует симптомы поверхности, игнорируя основную проблему. Например, если формат ввода содержит текст JSON, то правильное решение должно использовать модуль 'json' для его анализа вместо' unicode-escape' - в вашем вопросе недостаточно подробностей, чтобы расшифровать, каков ваш фактический формат ввода. SQLite может и должен хранить один символ Unicode вместо последовательности байтов - исправить процесс, который записывает данные в базу данных и/или файл cvs. – jfs

+0

@ J.F.Sebastian, спасибо за комментарий. Ваш ответ тоже полезен. В то время как «unicode-escape» помогает мне стать всего лишь небольшой точкой во всех моих вещах, но в будущем мне придется переписать некоторые базы данных SQLite, и ваш совет будет рассмотрен! Спасибо! – awulll

1

Важно помнить, что все байты. Чтобы вытащить байты в нечто полезное для вас, вам нужно знать, какая кодировка используется при загрузке данных. Слишком много неоднозначных случаев для определения кодирования путем анализа данных. Когда вы отправляете данные из своей программы, все возвращается обратно в байты. В зависимости от того, используете ли вы Python 2.x или 3.x, у вас будет совсем другой опыт работы с Unicode и Python.

Вы можете, однако, попытаться кодировать и просто «заменить» на ошибки. Например, the_string.encode("utf-8","replace") будет пытаться кодировать как utf-8 и заменяет проблемы ?. Вы также можете предвидеть проблемные символы и их заменять заранее, но это быстро становится неуправляемым. Взгляните на классы codecs для получения дополнительных возможностей замены.

+0

спасибо, но дело в моем случае. У меня только юникод, но «\ u2083» - это 6 символов, а не один, как мне нужно.Мне нужно преобразовать одну строку с 6 символами ('\ u2083') в один символ Юникода (\ u2083, маленький 3 в озоне) и сделать это с любым другим символом. Я могу сделать функцию с таблицей unicode и делать некоторые замены, когда это необходимо, но если есть другой способ управления, было бы хорошо. – awulll

1

SQLite позволяет вам читать/писать текст Unicode напрямую. u'O\u2083' is два знаков u'O' и u'\u2083' (ваш вопрос опечаток: 'u\2083' != '\u2083').

Я понимаю, что и \ 2083 не хранятся в базе данных SQLite, как юникода характер, но как 6 символов Юникода (который будет U, \, 2,0,8,3)

Дон 't путать u'u\2083' и u'\u2083': последний является одиночным символом, в то время как первый является 4-символьной последовательностью: u'u', u'\x10' ('\20' - это восьмеричный код на Python), u'8', u'3'.

Если вы сохраняете один символ Unicode u'\u2083' в базе данных SQLite; он сохраняется как один символ Unicode (внутреннее представление Unicode внутри базы данных не имеет значения до тех пор, пока выполняется абстракция).

На Python 2, если нет from __future__ import unicode_literals в верхней части модуля затем 'abc' строковый литерал создает байтовую строку вместо строки Unicode - в этом случае как 'u\2083' и '\u2083' являются последовательностями байт, а не текстовые символов (\uxxxx не распознается как escape-последовательность unicode внутри байтов).

+0

Я отредактировал сейчас. Была моя ошибка. Это! Простите за это! – awulll

Смежные вопросы