我对 ConfigParser 的麻烦还在继续。它似乎不太支持Unicode。配置文件确实保存为 UTF-8,但是当 ConfigParser 读取它时,它似乎被编码成其他东西。我认为它是 latin-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' 变体,但这一点似乎没有实际意义,因为它从一开始就应该是一个 unicode 对象。毕竟,配置文件是 UTF-8 的?我已经确认 ConfigParser 通过使用这个 DummyConfig 类将文件存根来读取文件的方式有问题。如果我使用它,那么一切都是很好的 unicode,很好而且花花公子。
-- 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()
!