私はAppEngineでホストされているシンプルなRestletサービスを持っています。これは、文字列での基本的なCRUD操作を実行し、すべての動詞に対してcurlでテストすると、あらゆる種類のUTF-8文字でうまく動作します。GAEのRestletによってスクランブルされたUTF-8文字列
これは、別のAppEngineアプリのサーブレットでホストされているシンプルなのRestletクライアントによって消費されています
// set response type
resp.setContentType("application/json");
// Create the client resource
ClientResource resource = new ClientResource(Messages.SERVICE_URL + "myentity/id");
// Customize the referrer property
resource.setReferrerRef("myapp");
// Write the response
resource.get().write(resp.getWriter());
上記のほとんどすべて私がサーブレットに持っています。非常にプレーン。
サーブレットはjqueryのAJAX経由で呼び出され、私は戻って取得JSONがうまく形成されており、すべてが、問題は、UTF-8エンコードされた文字列は、例えば、スクランブル戻って来ているということです。 Université de Montréal
はUniversit?? de Montr??al
になります。
resp.setCharacterEncoding("UTF-8");
しかし、唯一のdiferenceは、私は(Universitᅢᄅ de Montrᅢᄅal
を得る代わりに??
を取得する私も、文字の種類、それらを知らないということです私はそう思うアジア人です)。
私は100%リセレットサービスがOKです。これは1行ずつデバッグする以外に、curlでcmd行からテストすることができ、整形式の文字列を返すためです。
firefoxからの応答のHTTPヘッダー(javascript経由でサーブレットを呼び出すとき)を見ると、エンコードが実際にはUTF-8であることがわかります。すべての可能な関連記事を読むのに苦労した後、私はthis restlet discussionに出くわしました。実際に私は応答のhttpヘッダーにTransfer-Encoding: chunked
を持っていることに気付きました。私は提案された解決策を試しました(ClientResource.toRepresentationをオーバーライドして、何もしなかったので、ClientResource.setRequestEntityBuffering(true)
で再提案2.1を試しました)。Transfer-Encoding: chunked
すべてに関連していると私は確信していません。
この時点で私はアイデアがなくなりました。本当にに感謝しています! O_O
UPDATE:
私は古典的なURLConnectionとマニュアルGETを行うと、文字列が無事戻って来てみました:
URL url = new URL(Messages.SERVICE_URL + "myentity/id");
URLConnection conn = url.openConnection();
InputStream is = conn.getInputStream();
StringWriter writer = new StringWriter();
IOUtils.copy(is, writer, "UTF-8");
resp.getWriter().print(writer.toString());
あまりにも多く、すべてのRESTfulや空想であることのため...しかし、まだ私は元のバージョンが動作しない理由を手掛かりがありません! :/
チャンク転送のエンコーディングは文字セットの問題とは無関係でなければなりません...問題の生の文字列を 'resp.getWriter()'に書き出し、 – bdonlan
あなたはサーブレットから私のサービスに「マニュアル」GETを行うことを意味しますか? – JohnIdol
更新を見て、私はrestletをバイパスしても問題ありません。私はそれがrestletバグかsmt O_oだと思います – JohnIdol