Уведомления

Группа в Telegram: @pythonsu

#1 Март 14, 2007 10:58:08

Нави Гатор
От:
Зарегистрирован: 2007-03-14
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlalchemy и utf-8

Если кто-то может, объясните, пожалуйста!
Присутстует программа, использующая wx и sqlalchemy.
Задача состоит в том, чтобы данные, допустим, из TextEntryDialoga записать в базу, а затем засунуть в TreeCtrl уже из базы. Сначала при показе дерева появляется ошибка типа “cannot decode to utf-8”. Если использвать при записи “.encode('utf-8')”, а при чтении “.decode('utf-8')” ошибка остаётся. Если использовать только encode, всё работает, но на экран вместо правильного текста вылезают крокозябли (“Р№Р№Р№” вместо “ййй”). Ошибка происходит только на русских символах.



Отредактировано (Март 14, 2007 11:11:53)

Офлайн

#2 Март 14, 2007 11:22:07

pythonwin
От:
Зарегистрирован: 2006-07-18
Сообщения: 1294
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlalchemy и utf-8

Нави Гатор, покажи пожалуйста код :)

PS посмотри Использование Unicode в Python (j2a)



Офлайн

#3 Март 14, 2007 11:47:33

Нави Гатор
От:
Зарегистрирован: 2007-03-14
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlalchemy и utf-8

class Main(object):
def __init__(self):
self.db = create_engine('sqlite:///data.db3',convert_unicode=True)
metadata = BoundMetaData(self.db)
self.session = create_session()
self.table = Table('table', metadata, autoload=True)
self.mapper = mapper(MyClass, self.table)
...
def addtreeitem(self,event):
dlg = wx.TextEntryDialog(self, 'Введите имя')
if dlg.ShowModal() == wx.ID_OK:
name=dlg.GetValue()
elem=MyClass(0,name.encode('utf-8'))
item=self.tree.GetSelection()
self.tree.GetPyData(item).addchild(elem)
i=self.tree.AppendItem(item,elem.name.decode('utf-8'),elem.type)
self.tree.SetPyData(i,elem)
self.tree.SetItemHasChildren(item)
elem.save
...
def refreshtreectrl(self,item):
self.tree.DeleteChildren(item)
for el in self.tree.GetPyData(item).children():
i=self.tree.AppendItem(item,el.name)
self.tree.SetPyData(i,el)
if el.haschildren():
self.tree.SetItemHasChildren(i)
self.tree.SortChildren(item)
...
class MyClass(object):
def save(self):
main.session.save(self)
main.session.flush
main=Main()
Приблизительно так.



Отредактировано (Март 14, 2007 12:03:17)

Офлайн

#4 Март 14, 2007 15:14:10

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

sqlalchemy и utf-8

Нави Гатор
Если использовать только encode, всё работает, но на экран вместо правильного текста вылезают крокозябли (“Р№Р№Р№” вместо “ййй”). Ошибка происходит только на русских символах.
Эти “кракозябли” – попытка показать utf-8 текст в cp1251 окружении. По-видимому, у тебя стоит wxpython-ansi. Есть два варианта:
1) либо использовать wxpython-unicode, и использовать юникод внутри программы (рекомендуемый)
2) оставить wxpython-ansi, но явно перекодировать в/из cp1251 (нерекомендуемый)



Офлайн

#5 Март 14, 2007 16:06:17

Нави Гатор
От:
Зарегистрирован: 2007-03-14
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlalchemy и utf-8

Идиотский вопрос:

явно перекодировать в/из cp1251
А это как?



Офлайн

#6 Март 14, 2007 19:23:30

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

sqlalchemy и utf-8

вот тут

name.encode('utf-8')
ты явно кодируешь из юникода в utf-8.

а тут
name.decode('utf-8')
из utf-8 в юникод.

Абсолютно аналогично и с cp1251



Офлайн

#7 Март 15, 2007 09:00:43

Нави Гатор
От:
Зарегистрирован: 2007-03-14
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlalchemy и utf-8

Второй вариант ни разу не помогает. С первым проблематично, так как я пишу не один.
Кроме того, разве “# -*- coding: cp1251 -*-” в начале не означает, что все кодируется/декодируется в/из ср1251? Если полностью перезапустить приложение, все становится нормально, но при добавлении новых записей проблема снова возникает. Может это все же что-то с sqlalchemy?



Офлайн

#8 Март 15, 2007 10:37:56

OlDer
От:
Зарегистрирован: 2006-07-19
Сообщения: 133
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlalchemy и utf-8

Нави Гатор
Может это все же что-то с sqlalchemy?
Прямо как у классика - “Может в консерватории что-то подправить?”. sqlalchemy тут не при чем.
Вам все уже написали. Прочитайте еще тут - http://wiki.wxpython.org/index.cgi/UnicodeBuild



Офлайн

#9 Март 15, 2007 11:58:26

Нави Гатор
От:
Зарегистрирован: 2007-03-14
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlalchemy и utf-8

Большое спасибо. Меня и правда жестоко переклинило. Все-таки перешел не wxpython-unicode и все прошло.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version