Django'da Türkçe karakter sorunu

880 views
Skip to first unread message

Muhammed Ali

unread,
Jun 24, 2014, 6:47:43 PM6/24/14
to python-...@googlegroups.com
Merhaba,
Django ile geliştirdiğim alışveriş uygulamasında bi ürünün herhangi bir field'ında türkçe karakter kullandığımda tarayıcıdan sayfaya girdiğimde

UnicodeEncodeError at /

'ascii' codec can't encode character u'\xd6' in position 0: ordinal not in range(128)

tarzında bir hata alıyordum. Kendi bilgisayarım üzerinde geliştirme yaparken bu sorunu her sayfaya

# -*- coding: utf-8 -*-
 
ekleyerek ve manage.py dosyasına 
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
ekleyerek aştım. Hangisi işe yaradı bilemiyorum.

Daha sonra uygulamayı webe taşıma amaçlı VPS'e aktarıp Gunicorn Nginx Supervisord yardımıyla  online hale getirdim. Tek fark sqlite yerine PostgreSQL kullanmam oldu. PostgreSQL kurulumundan kullanıcı ve db oluşturabilmekte sorun yaşadım, bir yerden sorunun locale ayarlarıyla ilgili olduğunu öğrendim ve hepsini tr_TR UTF-8 olarak ayarladım. Site sorunsuz çalışıyordu ta ki bir field'a türkçe karakter içeren bir metin girene kadar. Yukarıdaki sorunun aynısı tekrar karşıma çıktı. Sorunun locale ayarlamalarımdan kaynaklandığını düşünüyorum.
Bu ayarları: http://perlgeek.de/en/article/set-up-a-clean-utf8-environment  anlatıldığı şekilde yaptım.

Nereye baktıysam İngilizce makaleler var ve hep kendilerine göresini anlatıyorlar. Benim zaten ingilizce karakterlerle sorunum olmadığı için aklıma burası geldi.

Nasıl aşabilirim bu sorunu?

Teşekkürler.

kirpit

unread,
Jun 25, 2014, 7:08:26 AM6/25/14
to python-...@googlegroups.com
UnicodeEncodeError hatasi icerisinde bir unicode karakter (ornegin turkce karakter) olan text'i, encode etmeden string olarak almaya/basmaya calistigin zaman olur: str(u'örnek')

Dosyalarin basina -*- coding: utf-8 -*- eklemen yalnizca .py dosyalarinda hardcoded unicode karakter kullanabilecegini belirtir. 

Tahminimce psql veritabani encoding'i utf-8, ki oyle olmali. Buradan aldigin bir kayitda turkce karakter olunca dogal olarak bu sana unicode olarak geliyor ve bir yerde bununla str islemi yapmaya calisiyorsun. Eger sorun admin panelde olusuyorsa, modellerine __unicode__ ve __str__ fonksiyonlarini tanimlamalisin.

class MyModel(models.Model):
  # ...
  def __unicode__(self):
    return unicode(self.name) # psql'den zaten unicode gelmesi lazim

  def __str__(self):
    return unicode(self).encode('utf-8') # yukaridakini encode et demek

Bir baska neden ise vps'inde locale tanimlamasi yapilmamis veya utf-8 yapilmamis olabilir. Debian/Ubuntu icin "$ dpkg-reconfigure locales" olmasi lazim. Default en_US.UTF-8 yapman yeterli.

Kolay gelsin.

Muhammed Ali

unread,
Jun 25, 2014, 9:42:31 AM6/25/14
to python-...@googlegroups.com
Öncelikle teşekkür ederim ilginiz için.
Sıkıntının psql kaynaklı olmadığı konusunda hemfikiriz, sqlite ile denediğimde de aynı sorun var şu an.
Karakter sorunu yaşadığım modelda şu an şu fonksiyonlar tanımlı

def __unicode__(self):
        return unicode(self.title)
    
def __str__(self):
        return unicode(self).encode('utf-8') 
    
ilk fonksiyonu
def __unicode__(self):
        return str(self.title)
ve

def __unicode__(self):
        return str(u'self.title')

şeklinde de denedim bir şey değişmedi.

locale ayarlarını da en_US UTF-8 olarak değiştirdim bir şey değişmedi.

Sorun admin paneli dahil karakter sorunu yaşadığım modelın listeleneceği herhangi bir sayfada yaşanıyor.
Templatelerdeki türkçe karakterli metinlerde sorun olmuyor.
Kendiniz görmeniz açısından
Ürün ekleme sayfasından ürün ekleyip oluşan sonuca bakabilirsiniz. 
kullanici adi: masit
sifre: 11

mccakici

unread,
Jun 25, 2014, 11:19:36 AM6/25/14
to python-...@googlegroups.com
Merhaba,

__str__ metodunu aşağıdaki şekilde ayarlayıp dener misiniz?

def __str__(self):
        return self.title.encode('utf-8') 



25 Haziran 2014 Çarşamba 16:42:31 UTC+3 tarihinde Muhammed Ali yazdı:

emre yılmaz

unread,
Jun 25, 2014, 11:21:57 AM6/25/14
to python-...@googlegroups.com
__unicode__() metodlarina verecegin stringi smart_unicode fonksiyonundan gecirmen daha mantikli.

django.utils.encoding icinde olmasi lazim.


25 Haziran 2014 18:19 tarihinde mccakici <meh...@canercakici.com> yazdı:

--
Bu iletiyi Google Grupları'ndaki "Python Istanbul" grubuna abone olduğunuz için aldınız.
Bu grubun aboneliğinden çıkmak ve bu gruptan artık e-posta almamak için python-istanb...@googlegroups.com adresine e-posta gönderin.
Daha fazla seçenek için https://groups.google.com/d/optout adresini ziyaret edin.



--
E.Y

Huseyin Yilmaz

unread,
Jun 25, 2014, 11:22:39 AM6/25/14
to python-...@googlegroups.com
Muhammet selam,
Oncelikle omur torpusu encoding problemleri ile karsilastigin icin cok uzgunum. Bu tur unicode problemlerini ben genelde ayarlari random degistirip duzeldimi diye bakarak cozerim. Sana da aynisini oneririm.

Tahmin edecegin gibi probleminin cozumunu bulamadim. 2 Productindaki Görsell ve örnek titlelari, admin ekrani render edilirken unicode hatasi veriyor, fakat debug ekraninda aslanlar gibi render olabiliyor. deneyebilecegin seyler
1) python 3 e gec.
2) def __unicode__(self):
        return self.title

3) ipythondan product objelerini cekip titlelarini 
p.title
unicode(p.title)
gibi statementlari dene.
djangonun encoding paketinde yardimi olabilecek utility functionlari mevcut.

kolay gelsin.




--

Muhammed Ali

unread,
Jun 25, 2014, 11:22:44 AM6/25/14
to python-...@googlegroups.com
denedim, değişen bir şey olmadı maalsef.

Muhammed Ali

unread,
Jun 25, 2014, 11:38:49 AM6/25/14
to python-...@googlegroups.com
En son python3'e geçicem sanırım. Plugin azlığı korkutmasa çoktan geçmiştim zaten de işte amatörlük var ihtiyacım olan şeyi kolayca yazamamaktan çekiniyorum. :) Siz hangi sürümü kullanıyorsunuz 3'te? Hangisi daha yaygın? Ben de ona göre geçiş yapayım.

25 Haziran 2014 Çarşamba 18:22:39 UTC+3 tarihinde Huseyin Yilmaz yazdı:

şahin mersin

unread,
Jun 25, 2014, 2:10:40 PM6/25/14
to python-...@googlegroups.com
{{ product }} da hata çıkıyor herhalde.
product = u"öçşlüğ" ile gönderirseniz sorun cikmamasi lazım.


25 Haziran 2014 17:38 tarihinde Muhammed Ali <sitmuha...@gmail.com> yazdı:

Muhammed Ali Şit

unread,
Jun 25, 2014, 3:02:47 PM6/25/14
to python-...@googlegroups.com
Onu tam olarak nasil yapabilirim? Bilgi eksikligim cok maalsef. :)


25 Haziran 2014 21:10 tarihinde şahin mersin <electr...@gmail.com> yazdı:

--
Bu iletiyi Google Grupları'ndaki "Python Istanbul" grubunda bir konuya abone olduğunuz için aldınız.
Bu konunun aboneliğinden çıkmak için https://groups.google.com/d/topic/python-istanbul/_ZkUfybBOLc/unsubscribe adresine gidin.
Bu grubun ve tüm konularının aboneliğinden çıkmak için python-istanb...@googlegroups.com adresine e-posta gönderin.

Huseyin Yilmaz

unread,
Jun 26, 2014, 5:24:33 AM6/26/14
to python-...@googlegroups.com
Muhammet selam,

def __unicode__(self):
        return self.title

bunun calismadigini onayliyabilirmisin?
Senin problemin de bu gibi geldi de bana.

```
In [94]: st
Out[94]: 'Bayam\xc3\xb3n'

In [95]: print st
Bayamón

In [96]: unicode(st)
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-96-10b56212c5ff> in <module>()
----> 1 unicode(st)

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 5: ordinal not in range(128)

In [97]:
```

Yani utf-8 encoded birdaha utf-8 encode etmeye calisiyor gibi sanki.

```
In [97]: u = u'Bayamón'

In [98]: u
Out[98]: u'Bayam\xf3n'

In [99]: u.encode('utf-8')
Out[99]: 'Bayam\xc3\xb3n'

In [100]: u.encode('utf-8').encode('utf-8')
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-100-faf01ac4934b> in <module>()
----> 1 u.encode('utf-8').encode('utf-8')

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 5: ordinal not in range(128)

In [101]:
```

husonet

unread,
Jun 26, 2014, 9:06:51 AM6/26/14
to python-...@googlegroups.com
Dosyayı UTF-8 formatında kaydetmeyi deneyebilirsin.

Kolay gelsin...

25 Haziran 2014 Çarşamba 01:47:43 UTC+3 tarihinde Muhammed Ali yazdı:

Muhammed Ali

unread,
Jun 26, 2014, 9:10:05 AM6/26/14
to python-...@googlegroups.com
Selam,

 def __unicode__(self):
        return self.title
    
    def __str__(self):
        return unicode(self).encode('utf-8')

    

Bu sekilde kullanim yaptigim zaman manage.py uzerinden runserver yaptigimda malisit.com:30 seklinde aciyorum ve turkce karakterler sorunsuz cikiyor ancak nginx ve gunicorn uzerinden servera baglandigimda cikmiyor turkce karakterler. Cok ilginc. 
Bununla ilgili fikirlerinizi alayim bir de. :)


26 Haziran 2014 Perşembe 12:24:33 UTC+3 tarihinde Huseyin Yilmaz yazdı:

Zekeriya KOÇ

unread,
Jun 26, 2014, 9:16:28 AM6/26/14
to python-...@googlegroups.com
nginx ya da uwsgi processi UTF-8 locale ile calismiyor olabilir. ikisinin kesin UTF-8 locale ile calistigindan emin olmalisin.


26 Haziran 2014 16:10 tarihinde Muhammed Ali <sitmuha...@gmail.com> yazdı:



--

Muhammed Ali

unread,
Jun 26, 2014, 10:48:25 AM6/26/14
to python-...@googlegroups.com
Cogu yerde wsgi.py dosyasina sunu eklemem gerektigi soyleniyor ancak bende ise yaramadi maalesef.

os.environ['LC_ALL']="en_US.UTF-8"

Muhammed Ali

unread,
Jul 1, 2014, 10:06:36 AM7/1/14
to python-...@googlegroups.com
Sorunu cozdum. nginx.conf dosyasinda http'nin altina satirini eklemek gerekiyormus.
charset utf-8;
satirini eklemek gerekiyormus.
Ilginiz icin tesekkur ederim.

Reply all
Reply to author
Forward
0 new messages