Найти - Пользователи
Полная версия: Pylons, SQLALchemy, кодировка - UTF-8 - выводит ?????
Начало » Pyramid / Pylons / TurboGears » Pylons, SQLALchemy, кодировка - UTF-8 - выводит ?????
1 2 3
webchemist
Или это баг MySQLdb?
j2a
Чего-то не въезжаю. SQLite или MySQL?
webchemist
MYSQL
да, для таблиц стоит utf8_general_ci
webchemist
В общем при указании поля как Unicode в модели все работает нормально - данные выводятся в шаблоне как положено. Однако при этом для киррилических символов в базе хранится что -то вроде Ñ?ÑƒÑ (по крайней мере так отображается строка “рус” в PhpMyAdmin), для латинских - все нормально (например eng и есть eng). Должно ли так быть?
Есть другие источники данных, которые работают с UTF-8 и просто пишут в базу строки в UTF-8, о них, как я понимаю, можно забыть в таком случае…
webchemist
Переписал с использованием 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 неправильно поределяет кодировку базы???
slivlen
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
webchemist
Хотя вот если так:
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? Кто глючит?
webchemist
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???
webchemist
Однако при разборе результата выборки добавил unicode(name, ‘UTF-8’) - в шаблоне все номально.
webchemist
Т.е. вывод - оба ORM-a неправильно осуществляют перекодировку. Вопрос - что делать? Настройки какие только не ставил…
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