Python ve Türkçe Karakterler

From: Volkan YAZICI <volkan(dot)yazici(at)gmail(dot)com>
To: PostgreSQL Türkiye <pgsql-tr-genel(at)postgresql(dot)org>
Subject: Python ve Türkçe Karakterler
Date: 2005-05-07 10:22:02
Message-ID: 7104a7370505070322398f224a@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-tr-genel

Merhaba,

Bugün Python ile PostgreSQL üzerinde sorgu gerçekleştiren birinin
türkçe karakter sorunu üzerine ufak bir yazışma gerçekleşti. Belki
başkalarına da yardımcı olabileceği fikri ile, ileti yivinin bir
kısmını buraya da koymayı uygun buldum.

{{{ Fri, May 06, 2005 at 03:56:02PM +0300
> Postgresql'i db olarak kullanan bir php intranet applicationımız var.
> Performans sebepleri ile bu php kodunun bir kısmını plpython ile db
> server üzerinde, kalan kısmını ise python cgi ile çözmeyi planladık.

Eğer performans sizin için bu kadar önemliyse, Python için PostgreSQL
paketi ile sağlanan PyGreSQL API'si yerine psycopg'yi kullanmanızı
öneririm. (psycopg, PyGreSQL'e göre sunduğu esneklik, hız ve
kararlılığın yanında oldukça aktif bir geliştirme ekibine de sahiptir.
Nitekim Zope psycopg'yi tavsiye eder.)

Not: Bunun ışında Python uygulamalarınızda psyco
(http://psyco.sourceforge.net/) özelleştirilmiş derleycisini
kullanırsanız, artı bir hız farkı yakalamanız muhtemel olacaktır.

> Ancak python cgi üzerinde türkçe karakter içeren bir sorgu gönderdiğimiz
> zaman türkçe karakter sorun yaratmakta ve sorgu boş gelmektedir. Oysa
> plpython'da böyle bir sorun olmamaktadır.

Bu bana PostgreSQL'den çok kullandığınız API'nin bir sorunu gibi
geldi. PyGreSQL hakkında çok etraflı bir bilgim yok fakat posta
listelerinin arşivlerine göz attınız mı? Bir de unutmadan, herhalde
Python betiklerinizin başına "# -*- coding: <encoding-name> -*-"
satırını eklemeyi gözden kaçırmadınız sanırım.

Not: Kendi deneyimlerimden, yanlış hatırlamıyorsam, psycopg'nin türkçe
karakterler ile ilgili bir sorunu yok gibiydi.
}}}

{{{ Sat, 7 May 2005 00:22:01 +0300
> psycopg'yi de denedim bu arada ama sanırım benim sorunum ya python'da ya
> da linux da bir yerde çok temel bir yanlış yapıyorum.
> ------------------------------------------------------------------
> #!/usr/bin/python
> # -*- coding: UTF-8 -*-
>
> import psycopg
>
> mydb = psycopg.connect("host=192.168.203.10 dbname=...")
> mycur = mydb.cursor()
> mycur.execute ("select * from ...")
> res = mycur.fetchall()
> print res
> ------------------------------------------------------------------
>
> Çıktısı ise

> ...
> (..., 'G\xdcLTEN', ...)
> ...
>
> G\xdcLTEN, GÜLTEN olmalı fakat değil.
>
> Bu kadar basit bir örnekle çalışıyorum şu an. Sanırım benim çok temel bir
> noktada kaçırdığım basit bir hata var.
>
> import locale
> locale.setdefaultlocale(locale.LC_ALL, "tr_TR.ISO-8859-9")
> locale.resetlocale()
>
> satırları da betik içerisinde hata vermekte. Linux üzerindeki locale
> ayarlarımda aşağıdaki gibi
>
> #locale -a
> ...
> tr_TR
> tr_TR.iso88599
> tr_TR.utf8
> turkish
> ...
>
> # locale
> LANG=POSIX
> LC_CTYPE="tr_TR"
> LC_NUMERIC="tr_TR"
> LC_TIME="tr_TR"
> LC_COLLATE="tr_TR"
> LC_MONETARY="tr_TR"
> LC_MESSAGES="tr_TR"
> LC_PAPER="tr_TR"
> LC_NAME="tr_TR"
> LC_ADDRESS="tr_TR"
> LC_TELEPHONE="tr_TR"
> LC_MEASUREMENT="tr_TR"
> LC_IDENTIFICATION="tr_TR"
> LC_ALL=tr_TR
>
> glibc'nin versiyonu da 2.3.5-0
>
> Yukarıdaki çıktılar 2.6.8.1 çekirdekli debian serverimdan. Ancak FC3'de
> de aynı hata ile karşılaşmaktayım.

Bakın şu kod çalışıyor:

------------------------------------------------------------------
#!/usr/bin/python
"""
Eğer kaynak kodunun içinde türkçe karakter kullanmıyorsanız,
burada bir "# -*- coding <encoding> -*-" satırına da gerek yok.
"""
import psycopg as pg

dbconn = pg.connect('host=/tmp dbname=template1')
curs = dbconn.cursor()

"""
client_encoding'i UNICODE olarak ayarlarsanız, alacağınız sonuç
UNICODE karakter setinde olacaktır. Yani tamamen size kalmış.
"""
curs.execute('SET client_encoding TO LATIN5')

curs.execute('SELECT veri FROM ornektablo')
rows = curs.fetchall()

"""
decode() kütüphane fonksiyonunun, Python dökümantasyonunda geçen
açıklaması:

decode([encoding[, errors]])
Decodes the string using the codec registered for encoding.
encoding defaults to the default string encoding. errors may be
given to set a different error handling scheme. The default is
'strict', meaning that encoding errors raise UnicodeError. Other
possible values are 'ignore', 'replace' and any other name
registered via codecs.register_error. New in version 2.2.
Changed in version 2.3: Support for other error handling schemes
added.
"""
for row in rows:
print row[0].decode('string_escape')
------------------------------------------------------------------

Yukarıdaki program ben de client_encoding UNICODE için de, LATIN5 için
de gayet güzel çalışıyor.
}}}

İyi çalışmalar.

Responses

Browse pgsql-tr-genel by date

  From Date Subject
Next Message Volkan YAZICI 2005-05-09 20:30:02 Re: Python ve Türkçe Karakterler
Previous Message Devrim GUNDUZ 2005-05-03 05:55:04 Önemli: PostgreSQL'de 2 güvenlik açığı