[Python] Curiosa interpretazione dell'encoding nelle stringhe di mssql
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
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
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
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
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
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
> 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
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