Re: 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: Re: Python ve Türkçe Karakterler
Date: 2005-05-09 20:30:02
Message-ID: 7104a737050509133076e038b1@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-tr-genel

Merhaba,

İlgili yazışmanın 2. bölümü de geldi.

{{{ Sun, 8 May 2005 19:06:16 +0300
> Belki de en iyisi php'de kalmak, sadece sistem betikleri
> için python kullanmak

Bence ilk önce neden PHP yerine Python betiği seçtiğiniz üzerinde
duralım. Eğer gerekliyse elbette Python kullanılacak. Kimse su anahtarı
ile konserve açmak istemez.

Mesajınızda gördüğüm kadarı ile Python'u CGI, PHP'yi ise Apache modülü
olarak çalıştırıyorsunuz ve Python'u seçmenizin sebebinin performans
olduğundan bahsetmiştiniz. Peki ya size şöyle bir şey dersem: Apache
modülü olarak derlenen bir PHP betiği, CGI bir Python betiğinden daha hızlı
çalışacaktır. Bence ya Python'u da modüler olarak çalıştırın (Bkz.
mod_python) ya da PHP'ye devam edin.

Not: Madem performans sizin için bu kadar önemli, Python için psyco
kullanıp kullanmadığınızı sormaya gerek bile görmüyorum.

> Önce problemi değişkenleri bir birlerine atarken ortaya çıkıyor zannettim.
>
> Python 2.3.4 (#1, Feb 2 2005, 12:11:53)
> [GCC 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
> >>> a = "Şaşkın"
> >>> print a
> Şaşkın
> >>> a
> '\xc5\x9ea\xc5\x9fk\xc4\xb1n'
> >>> query = "select * from table where name = '%s'" % (a)
> >>> query
> "select * from table where name = '\xc5\x9ea\xc5\x9fk\xc4\xb1n'"
> >>> print query
> select * from table where name = 'Şaşkın'
> >>>

Ben burada bir yanlış göremedim. Python yapması gerekeni hatasız olarak
yapmış.

Gelin sizinkine benzer bir senaryo oluşturalım:

-- -
-- Bağlandığım terminalin karakter kodlaması ISO-8859-9 (Latin5)
-- -
=> CREATE TABLE tr_krktr_tbl(isim varchar, bilgi varchar);
CREATE TABLE
=> INSERT INTO tr_krktr_tbl VALUES ('Rıza Siğt', 'Şarküteri sahibi.');
ERROR: invalid byte sequence for encoding "UNICODE": 0xfd7a61
=> SET client_encoding TO LATIN5;
SET
=> INSERT INTO tr_krktr_tbl VALUES ('Rıza Siğt', 'Şarküteri sahibi.');
INSERT 18418 1
=> INSERT INTO tr_krktr_tbl VALUES ('Ahmet', 'Sakatatçı.');
INSERT 18419 1
=> UPDATE tr_krktr_tbl SET bilgi = 'Şarküteri işletmecisi.' WHERE
isim = 'Rıza Siğt';
UPDATE 1

-- -
-- psql'i kapatıp tekrar açıyorum.
-- -
=> SELECT isim FROM tr_krktr_tbl;
isim
-----------
Ahmet
Rıza SiÄt
(2 rows)

=> SET client_encoding TO LATIN5;
SET
=> SELECT isim FROM tr_krktr_tbl;
isim
-----------
Ahmet
Rıza Siğt
(2 rows)

=> SELECT bilgi FROM tr_krktr_tbl WHERE isim = 'Rıza Siğt';
bilgi
------------------------
Şarküteri işletmecisi.
(1 row)
-- -
-- Yukarıdaki sorgunun log çıktısı şu şekilde:
-- <2005-05-08 18:01:17 EEST:knt(at)test>LOG: 00000: statement: SELECT
-- bilgi FROM tr_krktr_tbl WHERE isim = 'R\u0131za Si\u011ft';
-- Buradaki verinin UNICODE karakter setinde olduğuna dikkat ediniz.
-- Yani ben veriyi LATIN5 karakter seti ile gönderdiğim halde, sunucu
-- bunu UNICODE şeklinde işlemiş.
-- -

Şimdi olayın Python yüzüne dönelim.

# Aşağıdaki komutları yukarıda psql'i çalıştırıken kullandığım terminal
# penceresinden giriyorum. Dolayısıyla burada da karakter setin LATIN5
Python 2.3.5 (#2, Mar 26 2005, 17:32:32)
[GCC 3.3.5 (Debian 1:3.3.5-12)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import psycopg
>>> dbconn = psycopg.connect('user=knt host=/tmp')
>>> dbconn = psycopg.connect('host=/tmp user=knt dbname=test')
>>> curs = dbconn.cursor()
>>> curs.execute('SET client_encoding TO LATIN5')
>>> curs.execute('SELECT isim, bilgi FROM tr_krktr_tbl');
>>> for row in curs.fetchall():
... print str(row)
...
('Ahmet', 'Sakatat\xe7\xfd.')
('R\xfdza Si\xf0t', '\xdeark\xfcteri i\xfeletmecisi.')
>>> curs.execute('SELECT isim, bilgi FROM tr_krktr_tbl');
>>> for row in curs.fetchall():
... print str(row).decode('string_escape');
...
('Ahmet', 'Sakatatçı.')
('Rıza Siğt', 'Şarküteri işletmecisi.')
>>> curs.execute('SELECT bilgi FROM tr_krktr_tbl
... WHERE isim = \'Rıza Siğt\'');
>>> for row in curs.fetchall():
... print str(row).decode('string_escape')
...
('Şarküteri işletmecisi.',)

Görüldüğü üzere Python komut satırında, dediğim ayarlar kullanıldığı
zaman bir sorun yaşanmıyor.

Devam edelim. Şimdi ise örnek bir Python CGI betiği:
-- -------------------------------------------------
#!/usr/bin/python
# -*- coding: ISO-8859-9 -*-

import psycopg

dbconn = psycopg.connect('host=/tmp user=knt dbname=test')
curs = dbconn.cursor()

curs.execute('SET client_encoding TO latin5')
isim = 'Rıza Siğt'
sorgu = 'SELECT bilgi FROM tr_krktr_tbl WHERE isim = \'%s\'' % (isim, )
curs.execute(sorgu)

print 'Content-type: text/plain; Charset=ISO-8859-9\n'
for row in curs.fetchall():
print row[0].decode('string_escape')
-- -------------------------------------------------

Herhalde yukarıdaki betiğin http://localhost/cgi-bin/python.cgi şeklinde
internet tarayıcısından çağrıldığında sorunsuz çıktı verdiğini
belirtmeme gerek yok. :)
}}}

İyi çalışmalar.

In response to

Browse pgsql-tr-genel by date

  From Date Subject
Next Message =?iso-2022-jp?B?Io7Ek2OBQIySiOoiIDxwb3BvbjJAYnJhaW4uY29tLnBrPg0=?= 2005-05-24 09:45:53 P[uTVXNuSCh
Previous Message Volkan YAZICI 2005-05-07 10:22:02 Python ve Türkçe Karakterler