- - PR -
JSPでMultiPartでの読み込みの文字化けについて。
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2005-04-30 15:11
文字化けという初歩的な問題なんですが、どうかおつきあいお願いします。
FormからMultipartで送られてきた、データを、ServletInputStreamクラスでよみこんで表示させてみると、 request元のページを「Shift_JIS」で作成すると、日本語表示は問題なくいけるのですが、「UTF-8」で作成すると、文字化けがおこります。そこで、読み込んだバイト列を文字列に変換するときに、「Shift_JIS」から「UTF-8」にエンコードして表示させようとしたのですが、 みそかつ −> みそかつ と正常に表示されるのに、 みそ −> み�? と正常に表示されません!! どうしてなんでしょうか? test.html (UTF-8で作成。これをShift_JISで作り、metaをShift_JISにすると正常に 表示される) <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> </head> <body> <form action="test.jsp" method="post" enctype="multipart/form-data"> <input type="text" name="text"> <input type="submit" value="submit"> </body> </html> test.jsp (UTF-8で作成) <%@ page contentType="text/html; charset=UTF-8"%> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> </head> <body> <% ServletInputStream in = request.getInputStream(); byte[] line = new byte[256]; String strLine; int i= 0; while(true) { i = in.readLine(line,0,256); if(i == -1) break; strLine = new String(line,0,i); out.println(new String(strLine.getBytes("SJIS"),"UTF-8")); //out.println(strLine); } %> </body> </html> |
|
投稿日時: 2005-04-30 17:45
つばさです。
ブラウザのバージョンとサーバの環境もかかれたほうが回答が得られ やすいと思います。 test.jspで strLine = new String(line,0,i); ↓ strLine = new String(line,0,i,"UTF-8"); とすれば、よいかと思います。 エンコードを指定しないとサーバのプラットフォームの デフォルトエンコード(WindowsならMS932)でbyte[]列の データを変換して文字列が組み立てられるからです。 |
|
投稿日時: 2005-04-30 23:19
つばささん、返事ありがとうございます。
サーバーは、Tomcat5.0でOSはWindowsです。 ブラウザはIEとMozillaで確認しています。 strLine = new String(line,0,i,"UTF-8"); としても、 みそ → み?? となってしまいます。 out.println(new String(strLine.getBytes("MS939"),"UTF-8")); としても結果はかわりませんでした。 みそかつ、なら正常に表示されるのも疑問なんです・・・ |
|
投稿日時: 2005-05-01 17:30
つばさです。
「みそかつ」がOKで「みそ」が「み??」というのはちょっと疑問です。 以下のようなUTF-8のJSPを実行した場合に、ブラウザに「みそ」の byte列はどのように表示されますでしょうか? --- ServletInputStream in = request.getInputStream(); byte[] line = new byte[256]; String strLine; int i= 0; while(true) { i = in.readLine(line,0,256); if(i == -1) break; out.println("i="+i+"<br/>"); for (int j=0; j<i; j++) { out.print(Integer.toHexString(line[j]&255)+":"); } out.println("<br/>"); strLine = new String(line,0,i-2,"UTF-8"); out.println(strLine); out.println("<br/>"); } --- こちらでためしたところ、以下のようになり、 「み」は、UTF-8の0xE381BFで「そ」は、UTF-8の0xE3819Dとなり 「みそ」が問題なく表示されますです。 (後ろの0x0D,0x0Aは改行コード) --- i=8 e3:81:bf:e3:81:9d:d:a: みそ --- IE6とFireFox1.0.3で試してみましたが、両方とも同じ結果です。 |
|
投稿日時: 2005-05-01 22:07
なぜだがわかりませんが、今回はきちんと正常に表示されています。
わけがわかりませんが、とりあえず解決ということになります。 このスレッドをみてくれたみなさん、ありがとうございました。 つばささんには本当にお世話になりました。 |
1