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

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

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

Абсолютно аналогично и с cp1251
Нави Гатор
Второй вариант ни разу не помогает. С первым проблематично, так как я пишу не один.
Кроме того, разве “# -*- coding: cp1251 -*-” в начале не означает, что все кодируется/декодируется в/из ср1251? Если полностью перезапустить приложение, все становится нормально, но при добавлении новых записей проблема снова возникает. Может это все же что-то с sqlalchemy?
OlDer
Нави Гатор
Может это все же что-то с sqlalchemy?
Прямо как у классика - “Может в консерватории что-то подправить?”. sqlalchemy тут не при чем.
Вам все уже написали. Прочитайте еще тут - http://wiki.wxpython.org/index.cgi/UnicodeBuild
Нави Гатор
Большое спасибо. Меня и правда жестоко переклинило. Все-таки перешел не wxpython-unicode и все прошло.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB