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
.
私は機知に富んでいます。