Discussione:
database e codifica caratteri
(troppo vecchio per rispondere)
Luca Mandolesi
2007-02-14 16:14:02 UTC
Permalink
Salve a tutti,
ho letto un po' di post in questo gruppo ma non credo di arrivarci da
solo. Non è proprio la mia materia.

Se da una GUI invio ad un database in postgres con codifica UTF8 le
lettere à ì ù ò è é, queste vengono scritte regolamente in una tabella
di due campi (id e campo di testo).
Quando vado a richiamare il valore e lo inserisco in una casella testo
della GUI scrive: à ì ù ò è é+
La cosa che poi non comprendo è che se richiamo il record e lo assegno
una variabile "var_1" e la stampo in output ho:
[1, '\xc3\xa0 \xc3\xac \xc3\xb9 \xc3\xb2 \xc3\xa8 \xc3\xa9']

se però provo a ad estrarre solo il secondo elemento e lo stampo a
schermo ottengo solo una riga vuota.

Devo mettere qualche encode o decode da qualche parte?

C'è da dire che ho messo anche le righe
#! /usr/bin/env python
#-*- coding: UTF8 -*-

in cima a tutti i file ma non mi pare che cambi molto (più che altro
centra qualcosa?) !

grazie a tutti e ciao
Topomorto
2007-02-14 17:34:12 UTC
Permalink
Post by Luca Mandolesi
Salve a tutti,
ho letto un po' di post in questo gruppo ma non credo di arrivarci da
solo. Non è proprio la mia materia.
Se da una GUI invio ad un database in postgres con codifica UTF8 le
lettere à ì ù ò è é, queste vengono scritte regolamente in una tabella
di due campi (id e campo di testo).
Quando vado a richiamare il valore e lo inserisco in una casella testo
della GUI scrive: à ì ù ò è é+
La cosa che poi non comprendo è che se richiamo il record e lo assegno
[1, '\xc3\xa0 \xc3\xac \xc3\xb9 \xc3\xb2 \xc3\xa8 \xc3\xa9']
se però provo a ad estrarre solo il secondo elemento e lo stampo a
schermo ottengo solo una riga vuota.
Devo mettere qualche encode o decode da qualche parte?
C'è da dire che ho messo anche le righe
#! /usr/bin/env python
#-*- coding: UTF8 -*-
in cima a tutti i file ma non mi pare che cambi molto (più che altro
centra qualcosa?) !
grazie a tutti e ciao
mah... io ho risolto utilizzando postgres in SQLASCII, e non mi da alcun
tipo di problema con le varie lettere accentate e caratteri strani....
Ciauz
Luca Mandolesi
2007-02-14 19:32:49 UTC
Permalink
Post by Topomorto
mah... io ho risolto utilizzando postgres in SQLASCII, e non mi da alcun
tipo di problema con le varie lettere accentate e caratteri strani....
Ciauz
Ho provato a ricreare il DB con SQL_ASCII ma se inserisco una "è" mi
ritorna "√®". Se uso phpMyAdmin la "è" è visualizzata correttamente.
E' possibile che sbaglio a fare le chiamate con SQLAlchemy? Oppure è
un problema del modo in cui lavora l'interfaccia?
Luca Mandolesi
2007-02-14 20:13:51 UTC
Permalink
in questo post http://groups.google.com/group/it.comp.lang.python/
browse_thread/thread/2ce08f50e8b13421/dd8609fe21a5c02e?
lnk=st&q=&rnum=6#dd8609fe21a5c02e
Alan Franzoni suggeriva di usare convert_unicode=True nell'engine. Se
lo metto e stampo solo il campo del record che contiene l'accento
ottengo:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe8' in
position 5: ordinal not in range(128)

Se invece non lo uso e nel campo scrivo "il mondo è bello", mi stampa:

il mondo bello.

Io continuo a provare tutte le combinazioni del caso...se scopro
l'arcano (che in python è sempre più semplice del previsto) posto la
solution

ciao a un grazie a "Deadrat" (Topomorto scritto cosi sembra un
supereroe)
Lawrence Oluyede
2007-02-14 20:51:17 UTC
Permalink
Post by Luca Mandolesi
Io continuo a provare tutte le combinazioni del caso...se scopro
l'arcano (che in python è sempre più semplice del previsto) posto la
solution
Non andare a caso: http://www.jorendorff.com/articles/unicode/
--
Lawrence, oluyede.org - neropercaso.it
"It is difficult to get a man to understand
something when his salary depends on not
understanding it" - Upton Sinclair
Lawrence Oluyede
2007-02-14 20:41:33 UTC
Permalink
Post by Luca Mandolesi
in cima a tutti i file ma non mi pare che cambi molto (più che altro
centra qualcosa?) !
Hai provato a stampare quelle stringhe da linea di comando? Sicuro che
sia PostgreSQL a combinare casini?
--
Lawrence, oluyede.org - neropercaso.it
"It is difficult to get a man to understand
something when his salary depends on not
understanding it" - Upton Sinclair
Luca Mandolesi
2007-02-14 21:05:30 UTC
Permalink
Post by Lawrence Oluyede
Hai provato a stampare quelle stringhe da linea di comando?
se intendo da linea di comando pg no. Su python ho semplicemente
messo un print dentro la funzione.

ma sto sito è un tot di roba: http://www.jorendorff.com/articles/
unicode/ !!!!! Vai che si studia!!!

Adesso provo a stampare da linea di comando python.

ciao
Luca Mandolesi
2007-02-14 21:26:07 UTC
Permalink
Sulla Idle di python stampa bene, è vero:

dalla query select tira fuori (1, ' il mondo \xc3\xa8 bello',)

se faccio
data = (1, ' il mondo \xc3\xa8 bello')
print data[1]
il mondo è bello

dalla mia funzione invece stampa vuoto con il print oppure se lo passo
ad una casella di testo scrive: il mondo è bello.

Sentite un po' io sto inserendo i dati facendo
self.styledTextCtrl_1.SetText(str(data[0][4]))
dove data = [(1, "il mondo \xc3\xa8 bello")]

Sarà mica il set il problema?
Luca Mandolesi
2007-02-14 21:29:23 UTC
Permalink
Sulla Idle di python stampa bene, è vero:

dalla query select tira fuori (1, ' il mondo \xc3\xa8 bello',)

se faccio
data = (1, ' il mondo \xc3\xa8 bello')
print data[1]
il mondo è bello

dalla mia funzione invece stampa vuoto con il print oppure se lo passo
ad una casella di testo scrive: il mondo è bello.

Sentite un po' io sto inserendo i dati facendo
self.styledTextCtrl_1.SetText(str(data[0][2]))
dove data = [(1, "il mondo \xc3\xa8 bello")]

Sarà mica il set il problema?
Luca Mandolesi
2007-02-14 21:30:13 UTC
Permalink
Sulla Idle di python stampa bene, è vero:

dalla query select tira fuori (1, ' il mondo \xc3\xa8 bello',)

se faccio
data = (1, ' il mondo \xc3\xa8 bello')
print data[1]
il mondo è bello

dalla mia funzione invece stampa vuoto con il print oppure se lo passo
ad una casella di testo scrive: il mondo è bello.

Sentite un po' io sto inserendo i dati facendo
self.styledTextCtrl_1.SetText(str(data[0][1]))
dove data = [(1, "il mondo \xc3\xa8 bello")]

Sarà mica il set il problema?
Luca Mandolesi
2007-02-14 21:47:00 UTC
Permalink
Scusate per sopra ma ho fatto un pastrocchio. Ho provato a eliminare
la ripetizione (di cui la prima sbagliata) del messaggio ma non va
via.
La prima volta avevo lanciato l'interfaccia sotto mac. Adesso ho
provando da windows e scrive: "il mondo è bello".
A parte che èbello sembra una codifica in romanesco (eheh eh), a
questo punto non è che dipende dalla piattaforma?
Mah?
Luca Mandolesi
2007-02-14 21:48:25 UTC
Permalink
La prima volta avevo lanciato l'interfaccia sotto mac. Adesso ho
provando da windows e scrive: "il mondo è bello".
A parte che èbello sembra una codifica in romanesco (eheh eh), a
questo punto non è che dipende dalla piattaforma?
Mah?
Nicola Larosa
2007-02-14 22:16:00 UTC
Permalink
Post by Luca Mandolesi
Devo mettere qualche encode o decode da qualche parte?
Vedi se ti aiuta questo:

http://groups.google.it/group/it.comp.lang.python/msg/5f65d21de35064e2
Post by Luca Mandolesi
C'è da dire che ho messo anche le righe
#! /usr/bin/env python
#-*- coding: UTF8 -*-
in cima a tutti i file ma non mi pare che cambi molto (più che altro
centra qualcosa?) !
No, serve a definire l'encoding usato nel codice sorgente, non c'entra con
l'encoding da e verso il database.
--
Nicola Larosa - http://www.tekNico.net/

Failed leaders are usually those who allow themselves to become insulated
from the real world by a clique that feeds them false information. [...]
Being a poor listener, especially an arrogant and pigheaded one hiding
behind a screen of minders, will ruin you faster than just about anything
else. -- Carmine Coyote, August 2006
Luca Mandolesi
2007-02-15 09:23:16 UTC
Permalink
Post by Nicola Larosa
http://groups.google.it/group/it.comp.lang.python/msg/5f65d21de35064e2
Letto tutto e letto anche tutto il topic.
A un certo punto topomorto suggerisce di fare un file

sitecustomize.py

con all'interno:
#sitecustomize.py
import sys
sys.setdefaultencoding('iso-8859-1')

e importarlo.

Fatto anche questo, ma sys non ha la funzione setdefaultencoding().

Forse passando da una versione all'altra di python è stata eliminata
la funzione?

Siccome in python è sempre più facile del previsto (spero), sono
andato nel file site.py e ho modificato la funzione setencoding
cambiando
encoding = "ascii"

in

encoding = "utf8".

Adesso legge tutti i caratteri compreso € ç etc.

Problemi:
1 - Nella doc string dice che si può modificare il valore da ascii in
quello che serve, ma mi chiedo se posso causare altri danni.
2 - come mai nella funzione setencoding del file site si continua a
trovare la chiamata a sys.setdefaultencoding() quando sys non ha
questa funzione?

Speriamo che sia questa la soluzione. Grazie a tutti per l'aiutone.
Prima che mi diciate che ho fatto un danno vado a guardare un po' di
lettere accentate
sulla mia interfaccia.

ciusss
Luca Mandolesi
2007-02-15 13:34:14 UTC
Permalink
Soluzione (credo):
come suggerito da Nicola Larosa leggendo il topic:

http://groups.google.it/group/it.comp.lang.python/browse_thread/thread/5f95af0adfa7c0eb/5f65d21de35064e2?#5f65d21de35064e2

a un certo punto Topomorto suggerisce di fare un file sitecustomize da
correggere con quanto suggerito da Vittorio Palmisano:

sitecustomize.py

con all'interno:

#sitecustomize.py
import sys
reload(sys)
sys.setdefaultencoding('utf8')


Inserire all'inizio della propria applicazione
import sitecustomize


Fatto e ora funziona tutto.
Legge pure le cediglie!!! Leggerà pure i caratteri beneventani?
(http://www.uniurb.it/Filosofia/bibliografie/paleografia/
beneventana.htm)
Speriam bene e grazie a tutti (come al solito) per la pazienza con un
eterno newbie

mando
Topomorto
2007-02-15 21:47:19 UTC
Permalink
Post by Luca Mandolesi
http://groups.google.it/group/it.comp.lang.python/browse_thread/thread/5f95af0adfa7c0eb/5f65d21de35064e2?#5f65d21de35064e2
a un certo punto Topomorto suggerisce di fare un file sitecustomize da
sitecustomize.py
#sitecustomize.py
import sys
reload(sys)
sys.setdefaultencoding('utf8')
Inserire all'inizio della propria applicazione
import sitecustomize
Fatto e ora funziona tutto.
Legge pure le cediglie!!! Leggerà pure i caratteri beneventani?
(http://www.uniurb.it/Filosofia/bibliografie/paleografia/
beneventana.htm)
Speriam bene e grazie a tutti (come al solito) per la pazienza con un
eterno newbie
mando
Domandona: che versione di python stai usando?
Io ho provvisoriamente accantonato la 2.5 perchè non mi tirava più su
come volevo io il mio sitecustomize (mistero).....
Inoltre mi dava altri problemini qua e la in particolare sulla memoria
su funzioni particolarmente aggressive... Sono quindi rimasto alla buona
2.4 e mi sono anche scordato il problema degli encoding da e verso DB....
--
Topomorto... per una sentenza sbagliata :'(
Topomorto dice NO alla pena di morte... soprattutto la sua.
Non uccidete la nostra libertà. Fermate Palladium
Don't kill our freedom. Stop Palladium
Luca Mandolesi
2007-02-16 08:11:57 UTC
Permalink
Post by Topomorto
Domandona: che versione di python stai usando?
Python 2.5
Post by Topomorto
Io ho provvisoriamente accantonato la 2.5 perchè non mi tirava più su
come volevo io il mio sitecustomize (mistero)
il tuo sitecustomize funzia bene (anzi benone) sotto la 2.5 con
l'accorgimento del reload

Per quanto riguarda la memoria, per le cose che faccio io, non sono un
buon test

cius

Loading...