Найти - Пользователи
Полная версия: Кодировка в Django
Начало » Django » Кодировка в Django
1
alafin
В Django проекте использую кодировку cp1251, но есть проблемы.
в settings.py имею:
DEFAULT_CHARSET = ‘cp1251’
Кодировка базы данных тоже cp1251_general_ci
Но в админке при добалении чего-либо на русском в базу данных получаю: ‘??????’
И в шаблонах, тот текст который статический отображется нормально, а тот что формируется динамически из базы тоже ‘??????’.
В чем может быть проблема, кто-нибудь знает?
Взято с http://forum.vingrad.ru/topic-127130.html
alafin
Попробуй перед занесением в таблицу прописать что-то наподобие этого:

from django.db import connection

cursor = connection.cursor()
cursor.execute(“SET NAMES CP1251”)
Kirax
Пару дней назад начал изучать Питон и Джанго.
Пробую выполнить обучалку отсюда http://www.djangoproject.com/documentation/tutorial01/ (polls)
Создал модели и базу, сделал такой тестовый скрипт создающий объект:

# -*- coding: utf-8 -*-
from mysite.polls.models import Poll
import datetime
p = Poll(question="Как дела?", pub_date=datetime.datetime.now())
p.save()
Сначала я делаю всё в utf-8: сам скрипт, mysql база, DEFAULT_CHARSET.
Работает, полёт нормальный!

Теперь меняю всё это на cp1251.
Traceback (most recent call last):
File "test.py", line 7, in <module>
p.save()
File "/usr/lib/python2.5/django/db/models/base.py", line 238, in save
','.join(placeholders)), db_values)
File "/usr/lib/python2.5/django/db/backends/util.py", line 12, in execute
return self.cursor.execute(sql, params)
File "/usr/lib/python2.5/site-packages/MySQL_python-1.2.2-py2.5-linux-i686.egg/MySQLdb/cursors.py", line 168, in execute
File "/usr/lib/python2.5/site-packages/MySQL_python-1.2.2-py2.5-linux-i686.egg/MySQLdb/cursors.py", line 82, in _warning_check
File "/usr/lib/python2.5/warnings.py", line 62, in warn
globals)
File "/usr/lib/python2.5/warnings.py", line 102, in warn_explicit
raise message
_mysql_exceptions.Warning: Incorrect string value: '\xCA\xE0\xEA \xE4\xE5...' for column 'question' at row 1
Как сие понимать? Это была джанга 0.96. Транк из svn выдает еще более суровую ошибку, что он эту строку не может преобразовать в юникод.

Более того в документации транку есть такой документ http://www.djangoproject.com/documentation/unicode/ в котором открытым текстом говорится что нельзя использовать какие-то другие кодировки кроме utf-8 внутри Джанго.

То есть получается что если у меня сайт в cp1251, то на каждом запросе будет выполнятся преобразование кодировок cp1251 => utf-8 и utf-8 => cp1251? И это нормально? Как-то мне это не нравится такой подход с точки зрения быстродействия и вообще…
slivlen
Kirax
То есть получается что если у меня сайт в cp1251, то на каждом запросе будет выполнятся преобразование кодировок cp1251 => utf-8 и utf-8 => cp1251? И это нормально? Как-то мне это не нравится такой подход с точки зрения быстродействия и вообще…
1. Преобразование будет выполнятся примерно так: utf-8 => Unicode и Unicode => cp1251.
Если не нравится писать в utf-8, то можешь сам создавать объекты юникодных строк из необходимой тебе кодировки(unicode(some_str, ‘cp1251’)).
2. Это нормально.
3. В Java, например, String - хранит юникод. При считывании и выводе строки автоматически преобразовывает ее к нужной кодировке. И от каких-либо серьезных потерь в производительности из-за этого особенно не страдает.
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