ConfigParser mit Unicode-Elementen
Meine Probleme mit ConfigParser gehen weiter. Es scheint, dass Unicode nicht sehr gut unterstützt wird. Die Konfigurationsdatei wird zwar als UTF-8 gespeichert, aber wenn ConfigParser sie liest, scheint sie in etwas anderes codiert zu sein. Ich nahm an, dass es Latin-1 war und ich dachte darüber nachoptionxform
könnte helfen:
-- 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")
Wenn ich die Konfiguration lese, erhalte ich natürlich:
'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
Ich habe ein paar verschiedene Dekodierungsvarianten ausprobiert, aber der Punkt scheint fraglich zu sein, da es eigentlich von Anfang an ein Unicode-Objekt sein sollte. Immerhin ist die Konfigurationsdatei UTF-8? Ich habe bestätigt, dass etwas in der Art und Weise nicht stimmt, in der ConfigParser die Datei liest, indem er sie mit dieser DummyConfig-Klasse ausliest. Wenn ich das benutze, ist alles schön Unicode, gut und 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
Alle Ideen, die dazu führen könnten, oder Vorschläge anderer Konfigurationsmodule, die Unicode besser unterstützen, sind herzlich willkommen. Ich möchte nicht verwendensys.setdefaultencoding()
!