Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 15, 2007 18:08:48

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

Pylons, SQLALchemy, кодировка - UTF-8 - выводит ?????

Или это баг MySQLdb?



Офлайн

#2 Авг. 15, 2007 18:33:49

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

Pylons, SQLALchemy, кодировка - UTF-8 - выводит ?????

Чего-то не въезжаю. SQLite или MySQL?



Офлайн

#3 Авг. 15, 2007 19:44:41

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

Pylons, SQLALchemy, кодировка - UTF-8 - выводит ?????

MYSQL
да, для таблиц стоит utf8_general_ci



Отредактировано (Авг. 15, 2007 19:45:21)

Офлайн

#4 Авг. 16, 2007 10:05:06

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

Pylons, SQLALchemy, кодировка - UTF-8 - выводит ?????

В общем при указании поля как Unicode в модели все работает нормально - данные выводятся в шаблоне как положено. Однако при этом для киррилических символов в базе хранится что -то вроде Ñ?ÑƒÑ (по крайней мере так отображается строка “рус” в PhpMyAdmin), для латинских - все нормально (например eng и есть eng). Должно ли так быть?
Есть другие источники данных, которые работают с UTF-8 и просто пишут в базу строки в UTF-8, о них, как я понимаю, можно забыть в таком случае…



Отредактировано (Авг. 16, 2007 10:07:02)

Офлайн

#5 Авг. 16, 2007 11:49:07

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

Pylons, SQLALchemy, кодировка - UTF-8 - выводит ?????

Переписал с использованием SqlObject - те же яйца. Если в базе хранятся читабельные киррилические строки UTF-8, выводятся как ?????. Если латинкие - выводятся номально.
Но! При добавлении строк как u'некая строка' начались вываливаться эксепшены - типа не могу перекодировать ascii. несмотря на утверждения, что по умолчанию используется UTF-8, в исходном коде идет сравенение с ascii. Везде исправил, ладно, идем дальше.
Получил вот такое:

'latin-1' codec can't encode characters in position 25-29: ordinal not in range(256)
c:\python25\lib\site-packages\MySQLdb\cursors.py in execute, line 149
Какого дьявола???
146.        db = self._get_db()
147. charset = db.character_set_name()
148. if isinstance(query, unicode):
149. query = query.encode(charset)
Получается, что MySQLDB неправильно поределяет кодировку базы???



Офлайн

#6 Авг. 16, 2007 12:43:36

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

Pylons, SQLALchemy, кодировка - UTF-8 - выводит ?????

webchemist
Аналогичные вещи уже обсуждались. Глянь, может найдешь что-нибудь полезное :)
http://python.com.ua/forum/viewtopic.php?id=550&p=1
http://forum.vingrad.ru/forum/topic-117344.html
http://softwaremaniacs.org/forum/viewtopic.php?id=175



Офлайн

#7 Авг. 16, 2007 12:59:16

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

Pylons, SQLALchemy, кодировка - UTF-8 - выводит ?????

Хотя вот если так:

connection = MySQLdb.connect(host="localhost",user="root", db="test_dev" ) 
cursor = connection.cursor()
cursor.execute( "SET NAMES UTF8" )
sql = "SELECT * FROM `test`"
cursor.execute(sql)
res = cursor.fetchall()
получаются нормальные строки из UTF-8 в базе…

1) INSERT - в коде пишу строку ‘Некая строка’ - все нормально втставляется и выводится
2) INSERT - в коде пишу строку u'Некая строка' - вылетает с ошибкой
'latin-1' codec can't encode characters in position 31-35: ordinal not in range(256)
Что то я ничего уже не понимаю… Почему latin-1? Кто глючит?



Офлайн

#8 Авг. 16, 2007 13:25:09

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

Pylons, SQLALchemy, кодировка - UTF-8 - выводит ?????

slivlen
Спасибо за ссылки - я видел.
При прямом использовании MySQLDB все вроде работает. Как бы теперь заставить работать какой-нибудь ORM…
Но! С небольшой модификацией перенес код в проект на Pylons:
получаю:

Module netsales.controllers.homepage:11 in index         
<< c.ps = test.select()
c.title = u'Индекс'
return render_response('homepage/index.html');
"""
def user(self):>> return render_response('homepage/index.html');
Module pylons.templating:356 in render_response
<<
response = pylons.response._current_obj()
response.content = render(*args, **kargs)
output_encoding = kargs.get('output_encoding')
encoding_errors = kargs.get('encoding_errors')>> response.content = render(*args, **kargs)
Module pylons.templating:337 in render
<< **cache_args)
return pylons.buffet.render(template_name=template, fragment=fragment,
format=format, namespace=kargs, **cache_args)

>> format=format, namespace=kargs, **cache_args)
Module pylons.templating:224 in render
<< log.debug("Rendering template %s with engine %s", full_path, engine_name)
return engine_config['engine'].render(namespace, template=full_path,
**options)>> **options)
Module mako.ext.turbogears:49 in render
<< info.update(self.extra_vars_func())

return template.render(**info)
>> return template.render(**info)
Module mako.template:114 in render
<< declared by this template's internal rendering method are also pulled from the given *args, **data
members. members."""
return runtime._render(self, self.callable_, args, data)

def render_unicode(self, *args, **data):>> return runtime._render(self, self.callable_, args, data)
Module mako.runtime:287 in _render
<< context = Context(buf, **data)
context._with_template = template
_render_context(template, callable_, context, *args, **_kwargs_for_callable(callable_, data))
return context.pop_buffer().getvalue()>> _render_context(template, callable_, context, *args, **_kwargs_for_callable(callable_, data))
Module mako.runtime:304 in _render_context
<< # if main render method, call from the base of the inheritance stack
(inherit, lclcontext) = _populate_self_namespace(context, tmpl)
_exec_template(inherit, lclcontext, args=args, kwargs=kwargs)
else:
# otherwise, call the actual rendering method specified>> _exec_template(inherit, lclcontext, args=args, kwargs=kwargs)
Module mako.runtime:337 in _exec_template
<< error_template.render_context(context, error=error)
else:
callable_(context, *args, **kwargs)>> callable_(context, *args, **kwargs)
Module homepage_index_html:29 in render_body
<< # SOURCE LINE 12
context.write(u' <li>')
context.write(unicode(pers.name))
context.write(u'</li>\n')
# SOURCE LINE 14
>> context.write(unicode(pers.name))
<type 'exceptions.UnicodeDecodeError'>: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128)
Ну откуда там ascii???



Офлайн

#9 Авг. 16, 2007 13:28:02

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

Pylons, SQLALchemy, кодировка - UTF-8 - выводит ?????

Однако при разборе результата выборки добавил unicode(name, ‘UTF-8’) - в шаблоне все номально.



Офлайн

#10 Авг. 16, 2007 13:29:06

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

Pylons, SQLALchemy, кодировка - UTF-8 - выводит ?????

Т.е. вывод - оба ORM-a неправильно осуществляют перекодировку. Вопрос - что делать? Настройки какие только не ставил…



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version