6

私は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éalUniversit?? 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.setRe​questEntityBuffering​(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や空想であることのため...しかし、まだ私は元のバージョンが動作しない理由を手掛かりがありません! :/

+1

チャンク転送のエンコーディングは文字セットの問題とは無関係でなければなりません...問題の生の文字列を 'resp.getWriter()'に書き出し、 – bdonlan

+0

あなたはサーブレットから私のサービスに「マニュアル」GETを行うことを意味しますか? – JohnIdol

+0

更新を見て、私はrestletをバイパスしても問題ありません。私はそれがrestletバグかsmt O_oだと思います – JohnIdol

答えて

1

私は古典的な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や空想であることのため...それでも、私は全く分からなぜ元のバージョンを持っていません動作しません! :/

0

応答に適切な "Content-Type"ヘッダーが含まれていますか? "Content-Type: application/json; charset=UTF-8"(文字セットに注意してください)のようなものでなければなりません。

開発サーバーを起動し、cURLを使用してコマンドラインからリソースを取得し、ヘッダーを検査してみてください。 curl -i http://localhost:8080/myentity/id。理論的には、ブラウザはJSONのためのUTF-8を仮定するべきですが、私はそれを信じません。

関連する問題