[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends:00137] Re: Tomcat-4.0.6 の <jsp:forward で文字化け



徳様、お返事ありがとうございます。

結果として文字化けは解消しました。
ただ、理解できていない点があるので、長いですが以下に書きます。
ちょっと混乱しているので文章が読みにくい点、ご了承ください。

> まずは、Tomcatがコンパイルした、from.javaファイルを読んでみてください。
> (これは、Tomcatホームのwork以下にあります)
> 読んでみれば何のことは無い、単にURLEncodingしていますよね。
> ということで、受ける側(今回で言うと、to.jsp)でも、ServletRequest.getParameter()したら、
> それをデコードしてやれば良いだけですね。

from.java読みました。
結果としてデコードはTomcatが自動で行っているのでは?という気がしました。。
(バージョンが4.1.18と4.0.6なのでここに違いがあるかもしれませんが(^^;;)

下記の様に直接値をvalueに入れている所がURLEncodingしている事は分かりました。
<jsp:param name="butto value="結果へ"/>

このvalueへのURLEncodingは
<%@ page contentType="text/html;charset=Shift_JIS" %>
で指定した文字コード(Shift_JIS)でEncodingされているようです。

一方変数を利用したURLEncodingは、
<jsp:param name="value2" value="<%= value2 %>"/>
Encodingしていないようです。

この状態でto.javaへforwardすると、
・getParameter()は自動でURLDecodeする。
・URLDecodeで使う文字コードは。
 <%@ page contentType="text/html;charset=Shift_JIS" %>
  で指定した文字コードが使われる

*******************

上記が*正しければ*私の作成したサンプルプログラムが文字化けを起こすのは

【valueに直接値を書き込んでいる場合】
・Shift_JISでURLEncodingして、Shift_JISでURLDecodeしているのでこの部分では問題無い。
・getParameter()した後でShift_JISから"8859_1"への変換をすればOK!

【valueに変数を使っている場合】
・URLEncodingせずに、Shift_JISでURLDecodeしているので、先頭バイトが消えている!
・URLEncodingを追加してやると上手く行く。
 ・UTF-8で統一させる場合
  【from.java】下記を追加
  value1 = URLEncoder.encode(value1,"UTF-8");
  value2 = URLEncoder.encode(value2,"UTF-8");
  【to.java】下記に変更
  String value1 = new String(request.getParameter("value1").getBytes("8859_1"),"UTF-8");
  String value2 = new String(request.getParameter("value2").getBytes("8859_1"),"UTF-8");

Shift_JISで統一させる場合はs/UTF-8/Shift_JIS/gです。
JavaDocでURLEncoderを見るとUTF-8が推奨されているので、UTF-8の方が標準的なのでしょうね。

結果としてこういう風に認識をしたのですが、どうも正しいとは思いづらいです。
まずforwardタグのvalue値へ直接[""]を使って記述するのと、String宣言した変数を使うので
挙動が変わるという点。
それと、UTF-8と8859_1はどちらも同じ意味だと思っていたのですが、この2つは別物なのでしょうか?
UTF-8のままだと文字化けを起こしてしまいます。

このあたりについてご教示頂けるととても嬉しいです。
では、長くなってしまいましたが、失礼します。

-- 
Pola