[Gfoss] postgres, spalialite, python e Collation

Salve a tutti,
tanto tempo provai a capire senza successo come fare ad impostare il plugin python per QGis in modo che dialogasse col database (postgres o postgis) con l’italica lingua, ma non capii veramente nulla.

Le domande a cui non so rispondere:

quale codifica dare al codice python?

(le intestazioni dei miei file al momento sono utf-8
#! /usr/bin/env python

-- coding: utf-8 --)

Quale codifica dare al db in postgres o SL?

Per ora lascio sempre utf-8

Per postgres Collation e Tipo di carattere?

Un manualino che ci possa capire qualcosa?

Ciao a tutti e grassie!
Luca

On Wed, Dec 05, 2012 at 12:13:25PM +0100, Luca Mandolesi wrote:

quale codifica dare al codice python?

Mi associo a quelli che con Python e Unicode e UTF-8 hanno
battuto il naso!

Il charset con cui scrivi il sorgente non è fondamentale, sebbene
sia meglio usare UTF-8 e dichiararlo con lo pseudo-commento
all'inizio del file stesso.

La parte importante e complicata è gestire correttamente il
charset durante la vita delle variabili nel programma.

Se può aiutare qui ho preso un po' di appunti, anche se gli
esempi sono su MySQL credo che la logica sia la stessa con
PostgreSQL:

https://www.rigacci.org/wiki/doku.php/doc/appunti/prog/python_unicode

In pratica devi sempre assicurarti che le variabili durante la
vita del programma siano type() = unicode.

Qusto ha il vantaggio - ad esempio - che la lunghezza in una
stringa della "a accentata" sia 1 carattere, indipendentemente
dalla codifica (in UTF-8 sono due byte).

Quindi devi stare attento quando leggi dal database a
decodificare le stringhe. Se hai fatto tutto per bene avviene in
automatico, altrimenti ti trovi una stringa type() = str e quindi
la devi forzare con pippo = pippo.decode('utf-8').

Infine devi stare attento a codificare (in utf-8, mi raccomando!)
le stringhe quando ne fai l'output (a schermo, nel database, su
file, ecc.).

Spero di non averti confuso ulteriormente!

--
Niccolo Rigacci - http://www.rigacci.net/
Firenze - Italy
Tel. Office: +39-055-9331021, Mobile: +39-327-5619352

2012/12/5 Niccolo Rigacci <niccolo@rigacci.org>

Quindi devi stare attento quando leggi dal database a
decodificare le stringhe. Se hai fatto tutto per bene avviene in
automatico, altrimenti ti trovi una stringa type() = str e quindi
la devi forzare con pippo = pippo.decode('utf-8').

Beh, intanto credo di essere sicuro al 99% che questo è sicuramente un mio
problema. Da postgres, tramite sqlalchemy ricevo i dati in formato
str().... quindi un punto di partenza c'è.
Passare da PG a sqlalchemy ai metodi delle pyqt sicuramente l'inghippo c'è
l'ho eccome.

Intanto grazie mille per la solidarietà, sentirsi soli è peggio che
sentirsi ignoranti sicuramente.

Ciao
Luca

ps: il plugin è piaciuto a Pechino, quindi pronti per suggerimenti col
cinese!!! 8 )

2012/12/5 Niccolo Rigacci <niccolo@rigacci.org>:

On Wed, Dec 05, 2012 at 12:13:25PM +0100, Luca Mandolesi wrote:

quale codifica dare al codice python?

Spero di non averti confuso ulteriormente!

non avrei saputo spiegarlo meglio :slight_smile:

Ti conviene provare e nel caso chiedere info sui singoli
punti. Lo pseudo-commento in cima che imposta la codifica
per il parser python io lo metto sempre, a scanso di equivoci.

Per il resto devi lavorare con gli unicode, come ha
già scritto Niccolò, quindi stare attento alle
conversioni da/a oggetti unicode.

Ciao e in bocca al lupo!

--
Giuseppe Sucameli - Faunalia

Allora…pare…da un primo esperimento aggiungendo all’engine di sqlalchemy un bel ?charset=utf-8
e racchiudendo i metodi di scrittura sulla gui o nel db in un bel unicode() [0] (prima avevo lasciato tutto con str())
che tutto funzioni liscio, senza fare chiamate a metodi tipo .toUtf8() a .decode(‘utf-8’).

Nel database PG le lettere accentate sono passate come tali: una à è salvata come una à. E’ corretto?

C’è differenza tra passare un valore racchiuso in un unicode() da fare .decode(‘utf-8’)?

Siccome i campi son tantini…non vorrei modificare tutto e poi c’è la fregatura dietro…

Ciao
Luca

[0]
unicode(self.comboBox_nazione.currentText())

···

2012/12/5 Giuseppe Sucameli <sucameli@faunalia.it>

2012/12/5 Niccolo Rigacci <niccolo@rigacci.org>:

On Wed, Dec 05, 2012 at 12:13:25PM +0100, Luca Mandolesi wrote:

quale codifica dare al codice python?

Spero di non averti confuso ulteriormente!

non avrei saputo spiegarlo meglio :slight_smile:

Ti conviene provare e nel caso chiedere info sui singoli
punti. Lo pseudo-commento in cima che imposta la codifica
per il parser python io lo metto sempre, a scanso di equivoci.

Per il resto devi lavorare con gli unicode, come ha
già scritto Niccolò, quindi stare attento alle
conversioni da/a oggetti unicode.

Ciao e in bocca al lupo!


Giuseppe Sucameli - Faunalia

Aggiungo qua più una nota che altro…poi magari se è interesse di altri si potrebbe fare una paginetta wiki per encoding e plugin in qgis

In questo caso, per esempio, nonostante all’interno di un dizionario passi un valore racchiuso in unicode, quando c’è lo spacchettamento per creare le stringhe, il codice non digerisce la cosa, perchè l’accento manda tutto a quel paese.

Però, aggiungendo una u davanti alla stringa, python sa che deve fare una conversione unicode e quindi il codice passa.

field_value_string = ", ".join([table + “.%s == u%s” % (k, v) for k, v in params.items()])