過去の投稿記事 new!
・【画像】漫画でわかる外国人参政権
・東京電力のHPで停電状態が確認できたり(サービス再開!)
・戦国時代 ~ 江戸時代の徳川家康が熱かった
・vaio のバッテリは寿命が短いような気がする
・話題の Western Digital 製 WD20EARS を購入した
・C01LC をビックカメラで買ってきた
・2025年には空中都市が現実化?!
・【動画】わかりやすい「宇宙ひも理論」
・今世紀には「富士山噴火」「東海連動地震」「首都圏直下型地震」か?
・滅びた町、南浜町が Googleストリートビューで見れる

【 amazon 送料無料キャンペーン 】

バックリンクはご自由にどうぞ!     http://mfsocket.blogspot.com/feeds/posts/default?alt=rss リンク集 / ログイン

2011/04/01
【GAE】Eclipse の Servlet で文字化けする時は

 
Java は API の数が膨大な為、微小な仕様に気づきにくい事があります。
 
Google App Engine for Java でサーブレットを作成し「日本語を出力しよう!」
挑んだものの、意外とハマってしまいがち。
 
Eclipse で作成する場合は通常、ソースコードはすべて UTF-8 になります。
Google App Engine が対応している文字コードも UTF-8 です。
 
以下のコードはほとんどの場合、日本語(マルチバイト文字)が文字化けし、
「?????」と表示されます。 
public void doGet( HttpServletRequest req, HttpServletResponse resp ) 
throws IOException {
PrintWriter out = resp.getWriter();
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/plain");

out.print( "こんにちは!" );
}
 
どこに問題があるか気づいたでしょうか?
 
これを解決するヒントは getWriter()setCharacterEncoding() の API 解説が
参考になります。
 
答えは、
 
getWriter() を呼び出した後に、setCharcterEncoding() をコールしても
無視される
 
という仕様が理由になります。また getOutputStream() と getWriter() は合わせて
コールすることが出来ませんので、以下のコードは例外が発生します。
 
public void doGet( HttpServletRequest req, HttpServletResponse resp )
throws IOException {
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/plain");
PrintWriter out = resp.getWriter();
try{
Writer writer = new PrintWriter(new OutputStreamWriter(resp.getOutputStream(), "UTF-8"));
writer.write( "こんにちは" );
writer.flush();
}catch( Exception e ){
out.print( "失敗だよ" );
}
}
 
Eclipse で日本語が出力されないという方は、上記の点を踏まえて確認して
みましょう。ソースの文字コードは、右クリックの「プロパティ」で
確認できます。
 
 eclipse_charcode_check
 
Eclipse で開発していると http://localhost:8888/ への反映が行われないことも
よく見かけますが、この場合 javaw.exe を一旦 kill した後、サーブレットを起動
すると反映されることが多い。
 
kill するには psr または taskkill を用いてプロンプトから消しましょう。
 
psr /c kill /n javaw.exe /a  => javaw.exe を全て強制終了させる。
 
ハイスペックPC でも Eclipse は起動の重さがありますね…。

0 コメント:

  • コメントには <b>, <strong>, <em>, <i>, <a> など一部の HTML タグを使用できます。