I problemi con ConfigParser continuano. Sembra che non supporti molto bene Unicode. Il file di configurazione è infatti salvato come UTF-8, ma quando ConfigParser lo legge sembra essere codificato in qualcos'altro. Ho pensato che era latin-1 e ho thougt sovrascrivendo optionxform
potrebbe aiutare:ConfigParser con elementi Unicode
-- configfile.cfg --
[rules]
Häjsan = 3
☃ = my snowman
-- myapp.py --
# -*- coding: utf-8 -*-
import ConfigParser
def _optionxform(s):
try:
newstr = s.decode('latin-1')
newstr = newstr.encode('utf-8')
return newstr
except Exception, e:
print e
cfg = ConfigParser.ConfigParser()
cfg.optionxform = _optionxform
cfg.read("myconfig")
Naturalmente, quando ho letto la configurazione ottengo:
'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
Ho provato un paio di diverse varianti di decodifica 's' ma il punto sembra discutibile, dal momento che dovrebbe essere un oggetto unicode dall'inizio. Dopotutto, il file di configurazione è UTF-8? Ho confermato che c'è qualcosa di sbagliato nel modo in cui ConfigParser legge il file estraendolo con questa classe DummyConfig. Se lo uso, allora tutto è univoco, bello e dandy.
-- config.py --
# -*- coding: utf-8 -*-
apa = {'rules': [(u'Häjsan', 3), (u'☃', u'my snowman')]}
class DummyConfig(object):
def sections(self):
return apa.keys()
def items(self, section):
return apa[section]
def add_section(self, apa):
pass
def set(self, *args):
pass
Tutte le idee che potrebbero essere la causa di questo o suggerimenti di altri moduli di configurazione che supporta Unicode migliori sono i benvenuti. Non voglio usare sys.setdefaultencoding()
!
Il pupazzo di neve non fa parte del 'latino-1' – u0b34a0f6ae
Mai e poi mai fare' tranne Exception'; prendi l'effettiva eccezione che sai come gestire. –