- PR -

JSPでMultiPartでの読み込みの文字化けについて。

1
投稿者投稿内容
totto
会議室デビュー日: 2005/04/20
投稿数: 13
投稿日時: 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/02/05
投稿数: 54
投稿日時: 2005-04-30 17:45
つばさです。

ブラウザのバージョンとサーバの環境もかかれたほうが回答が得られ
やすいと思います。

test.jspで
strLine = new String(line,0,i);

strLine = new String(line,0,i,"UTF-8");
とすれば、よいかと思います。
エンコードを指定しないとサーバのプラットフォームの
デフォルトエンコード(WindowsならMS932)でbyte[]列の
データを変換して文字列が組み立てられるからです。

totto
会議室デビュー日: 2005/04/20
投稿数: 13
投稿日時: 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/02/05
投稿数: 54
投稿日時: 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で試してみましたが、両方とも同じ結果です。
totto
会議室デビュー日: 2005/04/20
投稿数: 13
投稿日時: 2005-05-01 22:07
なぜだがわかりませんが、今回はきちんと正常に表示されています。

わけがわかりませんが、とりあえず解決ということになります。

このスレッドをみてくれたみなさん、ありがとうございました。

つばささんには本当にお世話になりました。
1

スキルアップ/キャリアアップ(JOB@IT)