[Python] Curiosa interpretazione dell'encoding nelle stringhe di mssql

2006-09-01 Per discussione Fabrizio Cornelli
Ciao a tutti,sono nuovo di questa lista ma scrivo codice da qualche tempo. Ho bisogno, in questi giorni, di interfacciarmi ad un db mssql (si lo so... :-)) e sto usando con discreta soddisfazione il modulo pymssql.
Chi ha realizzato il db al quale devo accedere ha avuto la brillante idea di usare dei caratteri accentati (Es: "id_attività") nei nomi delle tabelle e nei nomi dei campi, cosa che mi ha costretto, per non so quale questione di encoding, a creare delle viste con i nomi ascii, risolvendo temporaneamente il problema.
Ora sono in fase di ottimizzazione e devo eliminare quelle viste, l'esistenza di legacy ci impedisce di cambiare i nomi dei campi non ascii, devo trovare la maniera di accedervi deterministicamente da python.Qual'è il problema? presto detto: con l'interfaccia di idle e di pythonwin ci riesco, da python su riga di comando no.
Ho avuto l'accortezza (spero di aver fatto bene) di mettere in testa la stringa:-*- coding: latin-1 -*-Quindi ho proceduto con una query del tipo: server.query("select id_attività from prodotti")
L'errore fornito da python è una cosa del tipo:pymssql.DatabaseError: internal error: SQL Server message 207, severity 16, state 3, line 1:Il nome di colonna 'id_attivitÓ' non è valido.Notate come la à si è trasformata in Ó. Immagino che si tratti di un problema di encoding.
Mi sarei arreso (ci sbatto la testa da giorni) se non avessi visto funzionare quel codice. Quello che mi lascia incapace di spostarmi dal problema è che quel codice, da dentro idle funziona!Ho provato a convertire in unicode, esplicitare il codice ascii del carattere 'à', a minacciare il compilatore e a immolare un porcello a Odino. Senza risultati.
Qualcuno ha voglia di darmi una mano? (Per altro è avanzato del porcello.)Grazie! :-)-- Fabrizio Zeno Cornelli
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Curiosa interpretazione dell'encoding nelle stringhe di mssql

2006-09-01 Per discussione Lawrence Oluyede

Chi ha realizzato il db al quale devo accedere ha avuto la brillante idea di
usare dei caratteri accentati (Es: "id_attività") nei nomi delle tabelle e
nei nomi dei campi, cosa che mi ha costretto, per non so quale questione di
encoding, a creare delle viste con i nomi ascii, risolvendo temporaneamente
il problema.


Immolate lui come porcello perchè è un abominio :-)


Ho avuto l'accortezza (spero di aver fatto bene) di mettere in testa la
stringa:
-*- coding: latin-1 -*-


Questo ha poco a che vedere. Serve per i commenti e gli
identificatori. Insomma serve per poter "digitare" caratteri in
Latin-1 nel file .py. Ciò che tu stai facendo è passare al server una
stringa con un encoding che lui non sa. Non esiste stringa senza
encoding. Questo è un concetto fondamentale da capire. Se vuoi
approfondire: http://www.joelonsoftware.com/articles/Unicode.html e
http://www.jorendorff.com/articles/unicode/


Quindi ho proceduto con una query del tipo: server.query("select id_attività
from prodotti")
L'errore fornito da python è una cosa del tipo:
pymssql.DatabaseError: internal error: SQL Server message 207, severity 16,
stat
e 3, line 1:
Il nome di colonna 'id_attivitÓ' non è valido.


Questo perchè necessitiamo di una informazione fondamentale:

- in quale encoding è il database?

Una volta scoperto questo devi fare in modo di codificare tutte le
stringhe secondo il set di caratteri corretto. Vedrai che cosi si
risolverà il problema


--
Lawrence
http://www.oluyede.org/blog
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Curiosa interpretazione dell'encoding nelle stringhe di mssql

2006-09-01 Per discussione Manlio Perillo
Lawrence Oluyede ha scritto:
> [...]
> 
>> Ho avuto l'accortezza (spero di aver fatto bene) di mettere in testa la
>> stringa:
>> -*- coding: latin-1 -*-
> 
> Questo ha poco a che vedere. Serve per i commenti e gli
> identificatori. 

Ma serve anche per far sapere all'interprete come trasformare gli
unicode literal, o sbaglio?

> [...]

>> Quindi ho proceduto con una query del tipo: server.query("select
>> id_attività
>> from prodotti")
>> L'errore fornito da python è una cosa del tipo:
>> pymssql.DatabaseError: internal error: SQL Server message 207,
>> severity 16,
>> stat
>> e 3, line 1:
>> Il nome di colonna 'id_attivitÓ' non è valido.
> 

Il problema è che alla Microsoft hanno pensato bene di usare un encoding
diverso per la riga di comando.

L'encoding di sistema è cp1252, quello usato dalla riga di comando è cp850.

Per risolvere basta che esegui il comando
chcp 1252.

> Questo perchè necessitiamo di una informazione fondamentale:
> 
> - in quale encoding è il database?
> 

E lo chiedi pure?
Sarà cp1252. ;-)
(largamente compatibile con latin1, a parte la presenza del carattere
per l'euro e qualche altro paio di differenze)



Saluti  Manlio Perillo
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Curiosa interpretazione dell'encoding nelle stringhe di mssql

2006-09-01 Per discussione Fabrizio Cornelli
Ciao Lawrence,  grazie per la pronta risposta. :-)
> Ho avuto l'accortezza (spero di aver fatto bene) di mettere in testa la
> stringa:> -*- coding: latin-1 -*-Questo ha poco a che vedere. Serve per i commenti e gliidentificatori. Insomma serve per poter "digitare" caratteri inLatin-1 nel file .py. Ciò che tu stai facendo è passare al server una
stringa con un encoding che lui non sa. Non esiste stringa senzaencoding. Questo è un concetto fondamentale da capire. Se vuoiapprofondire: 
http://www.joelonsoftware.com/articles/Unicode.html
 ehttp://www.jorendorff.com/articles/unicode/
Grazie,
ho trovato molto interessante ( e divertente) l'articolo di Joel
Spolsky, purtroppo non mi ha aiutato molto a dipanare la questione
perchè quel che mi manca non è il concetto di UTF-8 o di Unicode, quel
che non capisco è come vengono usati in python.
Cerco di spiegarmi: dico che un sorgente ha l'encoding latin-1,
che è quello che attribuisce alla lettera à l'encoding \x83. Questo
quindi non ha effetto sulle stringhe definite banalmente come:a="stringa"
? Dipende da sys.getdefaultencoding?Ma perchè una stringa viene interpretata in una maniera se eseguita da python.exe e in un'altra se eseguita da python idle?Ho provato a guardare se per caso sys.getdefaultencoding

() restituisce qualcosa di diverso, ma in entrambi gli ambienti restituisce 'ascii'...

> Quindi ho proceduto con una query del tipo: server.query("select id_attività> from prodotti")> L'errore fornito da python è una cosa del tipo:> pymssql.DatabaseError: internal error: SQL Server message 207, severity 16,
> stat> e 3, line 1:> Il nome di colonna 'id_attivitÓ' non è valido.Questo perchè necessitiamo di una informazione fondamentale:- in quale encoding è il database?Una volta scoperto questo devi fare in modo di codificare tutte le
stringhe secondo il set di caratteri corretto. Vedrai che cosi sirisolverà il problemaOk, ci provo. Mi faccio un giro in rete e nella configurazione. :-)(grazie, forse è la volta che finisco per capire come non subire gli encoding!)
-- Fabrizio Zeno Cornelli


___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Curiosa interpretazione dell'encoding nelle stringhe di mssql

2006-09-01 Per discussione Manlio Perillo
Fabrizio Cornelli ha scritto:
> [...]
> 
> Ho provato a guardare se per caso sys.getdefaultencoding () restituisce
> qualcosa di diverso, ma in entrambi gli ambienti restituisce 'ascii'...
> 

Restituisce sempre ascii perchè nel modulo site.py, di default, gli si
dice di fare così.
Una risposta più sigificativa la ottieni da
locale.getpreferredencoding()


> [...]
>
> Ok, ci provo. Mi faccio un giro in rete e nella configurazione. :-)
> 
> (grazie, forse è la volta che finisco per capire come non subire gli
> encoding!)
> 

Non stai subendo gli encoding, stai subendo la Microsoft...



Saluti  Manlio Perillo
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Curiosa interpretazione dell'encoding nelle stringhe di mssql

2006-09-01 Per discussione Lawrence Oluyede

Cerco di spiegarmi: dico che un sorgente ha l'encoding latin-1, che è quello
che attribuisce alla lettera à l'encoding \x83. Questo quindi non ha effetto
sulle stringhe definite banalmente come:
a="stringa"


Se ho ben capito la risposta è si, o meglio... ASCII è un subset di Latin-1


Ma perchè una stringa viene interpretata in una maniera se eseguita da
python.exe e in un'altra se eseguita da python idle?


Le magie di Windows, a questo sinceramente non ti so dare una risposta
immediata. Può dipende da vari fattori. La customizzazione del
site.py, le variabili d'ambiente e altro.

--
Lawrence
http://www.oluyede.org/blog
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Curiosa interpretazione dell'encoding nelle stringhe di mssql

2006-09-01 Per discussione Fabrizio Cornelli
> Ma perchè una stringa viene interpretata in una maniera se eseguita da
> 
python.exe e in un'altra se eseguita da python idle?Le magie di Windows, a questo sinceramente non ti so dare una rispostaimmediata. Può dipende da vari fattori. La customizzazione delsite.py, le variabili d'ambiente e altro.
Sembra che sql encodi in ucs-2, non ho trovato, nonostante mille tentativi, una soluzione chiara.Alla fine, la soluzione che terrò, è un triste workaround:idle.bat -r mystrangeencodedscript.py

Mi riservo di capire cosa diavolo faccia PyShell. :-)Ciao a tutti.
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Curiosa interpretazione dell'encoding nelle stringhe di mssql

2006-09-01 Per discussione Lawrence Oluyede

Sembra che sql encodi in ucs-2, non ho trovato, nonostante mille tentativi,
una soluzione chiara.


UCS-2 è una famiglia di encoding. Immagino che sia UTF-8... Se fai
stringa.decode("utf-8") non va?


--
Lawrence
http://www.oluyede.org/blog
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python