poj*_*ojo 21 python unicode configparser
我的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")
Run Code Online (Sandbox Code Playgroud)
当然,当我读到配置时,我得到:
'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
我已经尝试了几种不同的解码方法,但这一点似乎没有实际意义,因为它从一开始就应该是一个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
Run Code Online (Sandbox Code Playgroud)
任何可能导致此问题的想法或其他支持Unicode的配置模块的建议都是最受欢迎的.我不想用sys.setdefaultencoding()!
Ten*_*she 21
该ConfigParser.readfp()方法可以采用文件对象,您是否尝试使用编解码器模块使用正确的编码打开文件对象,然后将其发送到ConfigParser,如下所示:
cfg.readfp(codecs.open("myconfig", "r", "utf8"))
Run Code Online (Sandbox Code Playgroud)
对于Python 3.2或更高版本,readfp()不推荐使用.请read_file()改用.
Krz*_*ski 11
在 python 3.2encoding参数中引入了read(),所以现在可以用作:
cfg.read("myconfig", encoding='utf-8')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20138 次 |
| 最近记录: |