Python 如何通过plone浏览器代理web服务,生成utf-8编码的xml

Python 如何通过plone浏览器代理web服务,生成utf-8编码的xml,python,ajax,character-encoding,plone,zope,Python,Ajax,Character Encoding,Plone,Zope,我有一个Plone 3.3站点,它从RESTful web服务检索信息;该服务返回utf-8编码的xml数据。请求通过一个特殊的浏览器发送(对于这个问题,我们称之为@@proxy)。只要不返回非ASCII数据,一切正常 浏览器的get方法如下所示: def get(self, thedict=None): """ reduced version for stackoverflow """ context = self.context request = c

我有一个Plone 3.3站点,它从RESTful web服务检索信息;该服务返回utf-8编码的xml数据。请求通过一个特殊的浏览器发送(对于这个问题,我们称之为
@@proxy
)。只要不返回非ASCII数据,一切正常

浏览器的
get
方法如下所示:

def get(self, thedict=None):
    """
    reduced version for stackoverflow
    """
    context = self.context
    request = context.request
    response = request.response
    if thedict is None:
        thedict = request.form
    theurl = '?'.join((basejoin(SERVICEBASE, thedict['path']),
                       urlencode(auth_data),
                       ))
    fo = urlopen(theurl)
    code = fo.code
    headers = fo.info().headers
    for line in headers:
        name, text = line.split(':', 1)
        response.setHeader(name, text.strip())    # trailing \r\n
    text = unicode(fo.read(), 'utf-8')
    # --- debugging only ... -- 8< ----- 8< ----- 8< ----- 8< ----- 8<
    CHARSHERE = set(list(text))
    funnychars = CHARSHERE.difference(XMLCHARS)
    if funnychars:
        funnychars = u''.join(tuple(funnychars))
        logger.info('funny chars: %r' % funnychars)
    elif 1:
        logger.info('funny chars: none')
    # --- ... debugging only -- >8 ----- >8 ----- >8 ----- >8 ----- >8
    response.setBody(text.encode('utf-8'))
(英文:xml处理错误:未找到元素;第1行第1列)

由于我不是该服务的作者,我不能完全确定数据是否真的是
UTF-8
(尽管HTTP头和
行这样说)

我犯了什么错?我能做些什么来发现问题?我是否遗漏了Zope的响应对象和/或
urllib2.urlopen

我也试过类似的方法(浓缩):

。。。或者反过来说;我从来没有得到任何解码错误

我将“原始”数据写入一个文件(
open(filename,'wb')
),我用vim(
set-enc?fenc?
)检查了该文件,得到了
utf-8


我已经绞尽脑汁了。

关于代码的快速注释:
elif 1:
可以写成
else:
。您只需执行
set(text)
,无需在那里使用
list()
。将集合传递给
join
时,无需将其强制转换为
tuple()
<代码>u“”。加入(funnychars)可以正常工作。这应该可以正常工作;将body设置为
text.encode('utf-8')
在我使用它的任何地方都可以正常工作。您需要更详细地解释浏览器中出现的错误;你说的“浏览器不喜欢结果”是什么意思?也许你的代码更像这样@Martijn:当然我知道
其他:
,但是
elif 1:
可以通过改变一位(
1
0
)轻松地打开/关闭。。。我经常将其用于调试/开发目的。对于真正的逻辑,我使用
else
;-)@托拜厄斯:你不会相信电视上有多少海报,所以我不知道这样的事情。。。
XML-Verarbeitungsfehler: Kein Element gefunden
Adresse: http://.../@@proxy/get
Zeile Nr. 1, Spalte 1:

^
fo = urlopen(theurl)
raw = fo.read().strip()
try:
    text = unicode(raw, 'utf-8')
    logger.info('Text passes off as utf-8')
except Exception, e:
    logger.info('no valid utf-8:')
    logger.exception(e)
    text = unicode(raw, 'latin-1')