moje problemy z ConfigParser kontynuować. Wygląda na to, że bardzo dobrze nie obsługuje Unicode. Plik konfiguracyjny jest rzeczywiście zapisany jako UTF-8, ale kiedy odczytuje go program ConfigParser, wydaje się być zakodowany w coś innego. Sądziłem, że to latin-1 i thougt nadrzędnymi optionxform
może pomóc:ConfigParser z elementami 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")
Oczywiście, kiedy czytam config uzyskać:
'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
Próbowałem kilka różnych odmian dekodowanie, ale punkt wydaje się dyskusyjny, ponieważ od początku powinien być obiektem unicode. W końcu plik konfiguracyjny to UTF-8? Potwierdziłem, że coś jest nie w porządku w sposobie, w jaki program ConfigParser odczytuje plik przez upuszczenie go za pomocą tej klasy DummyConfig. Jeśli tego używam, wszystko jest w porządku, unicode, dobrze i 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
Wszelkie pomysły, które mogą być przyczyną tego lub sugestie innych modułów konfiguracyjnych, które lepiej obsługują Unicode, są mile widziane. Nie chcę używać sys.setdefaultencoding()
!
Bałwan nie jest częścią 'latin-1 ' – u0b34a0f6ae
kiedykolwiek Nigdy nie rób' wyjątkiem Exception'; wychwycić faktyczny wyjątek, który wiesz, jak sobie z tym poradzić. –