Форум сайта python.su
Если кто-то может, объясните, пожалуйста!
Присутстует программа, использующая wx и sqlalchemy.
Задача состоит в том, чтобы данные, допустим, из TextEntryDialoga записать в базу, а затем засунуть в TreeCtrl уже из базы. Сначала при показе дерева появляется ошибка типа “cannot decode to utf-8”. Если использвать при записи “.encode('utf-8')”, а при чтении “.decode('utf-8')” ошибка остаётся. Если использовать только encode, всё работает, но на экран вместо правильного текста вылезают крокозябли (“Р№Р№Р№” вместо “ййй”). Ошибка происходит только на русских символах.
Отредактировано (Март 14, 2007 11:11:53)
Офлайн
Нави Гатор, покажи пожалуйста код :)
PS посмотри Использование Unicode в Python (j2a)
Офлайн
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)
Офлайн
Нави ГаторЭти “кракозябли” – попытка показать utf-8 текст в cp1251 окружении. По-видимому, у тебя стоит wxpython-ansi. Есть два варианта:
Если использовать только encode, всё работает, но на экран вместо правильного текста вылезают крокозябли (“Р№Р№Р№” вместо “ййй”). Ошибка происходит только на русских символах.
Офлайн
Идиотский вопрос:
явно перекодировать в/из cp1251А это как?
Офлайн
вот тут
name.encode('utf-8')
name.decode('utf-8')
Офлайн
Второй вариант ни разу не помогает. С первым проблематично, так как я пишу не один.
Кроме того, разве “# -*- coding: cp1251 -*-” в начале не означает, что все кодируется/декодируется в/из ср1251? Если полностью перезапустить приложение, все становится нормально, но при добавлении новых записей проблема снова возникает. Может это все же что-то с sqlalchemy?
Офлайн
Нави ГаторПрямо как у классика - “Может в консерватории что-то подправить?”. sqlalchemy тут не при чем.
Может это все же что-то с sqlalchemy?
Офлайн
Большое спасибо. Меня и правда жестоко переклинило. Все-таки перешел не wxpython-unicode и все прошло.
Офлайн