Stringhe Unicode e z3c.form
come evitare che i caratteri accentati siano un problema nelle nostre form
Questa ve la voglio (e me la voglio..) raccontare!
Usiamo z3c.form da tempo, e per fortuna, dato che è un validissimo strumento di lavoro, oltre che divertente e comodo da usare.
Tuttavia z3c.form arriva direttamente dal mondo Zope 3, e non usa lo stesso meccanismo di localizzazione di Plone (PlacelessTranslationService), ma direttamente l'engine i18n di Zope 3.
Nessun problema, se non fosse che dichiarando un'interfaccia come la seguente:
Societa = schema.TextLine(
title=_(u"Società"),
required=False,
)
al momento della visualizzazione invece di vedere la a accentata compare un carattere strano e inguardabile.
NB: l'operatore '_' rappresenta il message factory di progetto (che opera l'effettiva "traduzione" della stringa inserita).
Normalmente, non avendo capito dove si genera il problema, e quindi come si risolve, avrei scritto "Societa" senza accento, e buonanottealsecchio.. ma siccome, dopo aver chiesto in giro, anche altri avevano lo stesso problema, ho deciso di guardarci un po' piu' chiaro.
Fatte tutte le ricerche del caso su GG, nel codice, in pdb.. alla fine proprio non si capiva di chi fosse il problema: le stringhe erano gestite correttamente in unicode, e tutti gli strati stavano lavorando bene, ma allora?! di chi e' il problema?!
pensa che ti ripensa, alla fine ci sono arrivato:
Societa = schema.TextLine(
title=_(unicode("Società", "utf8")),
required=False,
)
ecco come ho risolto..
spiegazione che mi sono dato? per qualche motivo che non ho indagato, il sistema caricava si la stringa unicode, ma NON nell'encoding che mi sarei aspettato, una volta che gliel'ho imposto, il gioco è stato risolto..
spero sia utile a qualcun altro.. :)

Codifica dei sorgenti python
In pratica, poiché tu usi l'utf8 come codifica per i files sorgente, hai bisogno di una riga come
# -*- coding: utf-8 -*-
all'inizio del file.
O, in alternativa, come hai fatto tu, puoi creare una stringa binaria ("Società") e poi convertirla in oggetto unicode sapendone l'encoding.
Insomma, quale encoding usi python non lo può sapere e in un modo o nell'altro glie lo devi dire.