[Plone-IT] problema con la codifica dei caratteri

Yuri yurj a alfa.it
Gio 26 Feb 2009 10:03:22 UTC


Yuri ha scritto:
> wipedisk ha scritto:
>> ho Zope che si interfaccia a Postgresql 8.3 mediante psycopg.
>> il database "bottiglie" su postgresql e' UTF8.
>> il "locale" del server linux sul quale girano sia zope che pgsql e'
>> it_UTF8.
>> la direttiva "client encoding" su postgresql.conf e' UTF8 (anziche' il
>> default sql_ascii).
>>   
>
> Devi fare attenzione che c'è differenza tra stringhe unicode e 
> stringhe encodate utf-8
>
> http://mail.python.org/pipermail/python-list/2004-October/287444.html
>
> Quindi dovresti controllare che tipi di oggetti passa zope a psycopg, 
> e viceversa. Forse ha più senso che tu tenga i valori in postgres come 
> binary e lasci fare a Zope il resto, oppure encodi/decodi prima di 
> salvare in postgres.
>
> yurj a macbook:~$ python
> Python 2.5.2 (r252:60911, Jan  4 2009, 17:40:26)
> [GCC 4.3.2] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
> >>> x = u'\xc8'
> >>> print x
> È
> >>> y = x.encode('utf-8')
> >>> print y
> È
> >>> print x.encode('ascii')
> Traceback (most recent call last):
>  File "<stdin>", line 1, in <module>
> UnicodeEncodeError: 'ascii' codec can't encode character u'\xc8' in 
> position 0:
> ordinal not in range(128)
> >>> print y.encode('ascii')
> Traceback (most recent call last):
>  File "<stdin>", line 1, in <module>
> UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 
> 0: ordinal
> not in range(128)
> >>> z = x.encode('latin1')
> >>> print z
>> >>>y
> '\xc3\x88'
> >>>


Forse questo è ancora più chiaro:

 >>> w = "È"
 >>> w.encode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: 
ordinal not in range(128)
 >>> y = w.decode('utf-8')
 >>> print y
È
 >>> y
u'\xc8'
 >>>

cioè w contiene È ma non è una stringa unicode, anche se contiene un 
carattere utf-8 che viene stampato correttamente solo perchè il 
terminale lo sa gestire.



>
>
>> purtroppo succede che immettendo dall'applicazione zope dei valori nei
>> campi che poi vengono trasferiti al database, lettere accentate o
>> simboli come quello dell'ordinale (°) italiano, nel database non
>> ottengo sempre lo stesso carattere.
>>
>> anzi... il problema e' che mi ritrovo sempre qualche errore tipo:
>> UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position
>> 48: ordinal not in range(128)
>>
>> Ho cercato con google trovando indicazioni piu' che altro su persone
>> che hanno il mio stesso problema e non l'hanno risolto (zope) oppure su
>> persone che l'hanno risolto (ma si riferivano ad applicazioni con php).
>>
>> Ho anche provato ad agire sulle impostazioni di Firefox, forzano la
>> codifica a UTF8 oppure a quella sua di default, se installato per la
>> lingua italiana, ISO 8891-qualcosa (ora non ricordo...) ma niente lo
>> stesso. Le accentate diventano "bombe" dentro postgresql quando sono
>> richiamate da Zope.
>>
>>
>>
>>   
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> Plone-IT mailing list
>> Plone-IT a lists.plone.org
>> http://lists.plone.org/mailman/listinfo/plone-it
>> http://www.nabble.com/Plone---Italy-f21728.html
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Plone-IT mailing list
> Plone-IT a lists.plone.org
> http://lists.plone.org/mailman/listinfo/plone-it
> http://www.nabble.com/Plone---Italy-f21728.html





Maggiori informazioni sulla lista Plone-IT