мои проблемы с ConfigParser продолжаются. Кажется, он не поддерживает Unicode очень хорошо. Конфигурационный файл действительно сохраняется как UTF-8, но когда ConfigParser читает его, он, похоже, кодируется во что-то другое. Я предположил, что это была латинская-1, и я thougt перекрывая optionxform
может помочь:ConfigParser с элементами 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")
Конечно, когда я прочитал конфигурации я получаю:
'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()
!
Снеговик не является частью 'латино-1' – u0b34a0f6ae
Никогда не делать' кроме Exception'; поймать фактическое исключение, которое вы знаете, как обращаться. –