Мои проблемы с ConfigParser продолжаются. Кажется, он не очень хорошо поддерживает Unicode. Файл конфигурации действительно сохраняется как UTF-8, но когда ConfigParser читает его, он, похоже, кодируется во что-то другое. Я предположил, что это латиница-1, и я думаю, что переопределение optionxform
может помочь:
-- 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")
Конечно, когда я читаю конфиг, я получаю:
'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
Я пробовал несколько различных вариаций декодирования «s», но дело, кажется спорным, так как это действительно должно быть юникода объект с самого начала. В конце концов, файл конфигурации UTF-8? Я подтвердил, что что-то не так в том, как ConfigParser читает файл, заглушая его этим классом DummyConfig. Если я этим воспользуюсь, то все в порядке, юникод, отлично и модно.
-- 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
Любые идеи, которые могут быть причиной этого, или предложения других конфигурационных модулей, которые лучше поддерживают Unicode, приветствуются. Я не хочу использовать sys.setdefaultencoding()
!