0

RESTful Web サービスから情報を取得する Plone 3.3 サイトがあります。このサービスは、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'))

unicodeまず、エンコーディング ( 、 )については何もしませんでしたencode。ただし、これは必要なようです。ウムラウトなどの非 ASCII データが含まれている場合 (例: INFO proxy@@w3l funny chars: u'\xdf')、ブラウザは結果を気に入りません。同じリクエストを(ブラウザtheurl経由ではなく)直接試みると、うまくいきます。@@proxyこの問題は、インターネット ブラウザに依存しません。つまり、Firefox と IE 咳の両方です。

Content-Type値 " " のヘッダーがありますtext/xml;charset=UTF-8。セミコロンの後ろにスペース文字を挿入しても何も変わりませんでした。

編集:これはSeamonkeyが言うことです:

XML-Verarbeitungsfehler: Kein Element gefunden
Adresse: http://.../@@proxy/get
Zeile Nr. 1, Spalte 1:

^

(英語: xml 処理エラー: 要素が見つかりません; 行 #1、列 #1)

私はサービスの作成者ではないため、データが実際のものであるかどうかは完全にはわかりません(ただし、HTTP ヘッダーと行はそう言っています)。 UTF-8<?xml ...>

私の間違いは何ですか?問題を見つけるにはどうすればよいですか? Zope の応答オブジェクトや について何か重要なことを見逃していますurllib2.urlopenか?

私もそのようなことを試しました(凝縮):

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')

...またはその逆。デコードエラーは一度もありませんでした。

「生の」データをファイル ( open(filename, 'wb')) に書き込んで、それを vim ( set enc? fenc?) で調べたところ、 utf-8.

私は機知に富んでいます。

4

0 に答える 0