- PR -

Servlet+JSPで日本語を出力するには?

投稿者投稿内容
ume
ベテラン
会議室デビュー日: 2001/09/19
投稿数: 55
投稿日時: 2001-09-20 09:51
ここにこのような質問を出していいのかわかりませんが教えて下さい。
Servlet内でJSPを呼び出し、画面を出力するプログラムを作成しているのですが、
日本語が認識されず「?」で表示されてしまいます。
JSPコード内で<%@ page contentType = "text/html; charset=EUC_JP" %>
と設定しています。
(charset=Shift_JIS でも同様です)
現在使用中の環境で、Servletからの画面出力、JSPからの画面出力では正常に表示されます。

何かご存知の方がいらっしゃいましたら教えて下さい。
よろしくお願いします。
環境は以下の通りです。

サーバ側
OS: Linux Redhat6.2J
WebServer: Apache1.3.20
ServletEngine: Tomcat3.2.3
Java: JDK1.3.1
クライアント側
OS:WindowsNT4.0
ブラウザ:IE5.0,NN4.7
おがわ
大ベテラン
会議室デビュー日: 2001/08/01
投稿数: 199
お住まい・勤務地: 千葉県
投稿日時: 2001-09-20 12:07
この種の話題は、どこでも尽きることがないですね。

[1] どこのタイミングで文字がうまく変換されないのか。(ここが一番肝心!!!)
Clientから要求されたRequestパラメータを受け取る時点なのか、それとも、Responseさせる時点なのか、または、その途中過程なのかを、トレースさせながら、丹念に調査する。
変換を行っている個所で、Stringの内容をUTF-8のまま16進でダンプしてみると、該当文字がはっきりする。

[補足] 文字定義が異なる理由で、ラウンドトリップ変換できない文字が一部存在する。
「A -> A' -> A」であれば問題ないが、「A -> A' -> B」となるケースがある。
JDBCを使ったWEB-DB環境では、よくあることなので注意する必要がある。
Oracle8iあたりは大変親切で、この辺の調査結果をきちんと公表していますね。

[ メッセージ編集済み 編集者: 謎の白覆面 編集日時 2001-09-20 15:47 ]
しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2001-09-20 15:37
EUC_JP でなく EUC-JP?
charset に指定したエンコーディングとファイルのエンコーディングは合っている?
tomcat が JSP コンパイラとして jikes を使っていない?
# あ、jikes だとコンパイル時に死ぬか。
ume
ベテラン
会議室デビュー日: 2001/09/19
投稿数: 55
投稿日時: 2001-09-21 10:05
ご回答ありがとうございました。
その後も検討を続けた結果、
呼出し側のservletのjavaコード内にPrintWriterを生成している文があり
その文を注釈化したところ、正常に表示されました。
JSPを使用する場合はservletからの出力との使い分けはできないのでしょうか?
おがわ
大ベテラン
会議室デビュー日: 2001/08/01
投稿数: 199
お住まい・勤務地: 千葉県
投稿日時: 2001-09-21 12:09
> その後も検討を続けた結果、
> 呼出し側のservletのjavaコード内にPrintWriterを生成している文があり
> その文を注釈化したところ、正常に表示されました。
> JSPを使用する場合はservletからの出力との使い分けはできないのでしょうか?
使い分けるというのは、具体的にはどういうことでしょうか???
ume
ベテラン
会議室デビュー日: 2001/09/19
投稿数: 55
投稿日時: 2001-09-21 13:11
お世話になります。

使い分ける、というのは例えば
servletの処理の途中でエラーが起こった場合はPrintWriter.printlnで
エラー画面を出力し、処理が正常終了して結果を出力する場合はJSPを使用する
といったものです。
PrintWriterを生成するコードを継承元クラスにおいたり、外部クラスにおいたり
してみたのですが、いずれも日本語が表示されませんでした。
しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2001-09-21 13:25

response.setContentType("text/html charset=Shift_JIS");

:

PrintWriter out =
new PrintWriter(
new OutputStreamWriter(
response.getOutputStream(), response.getCharacterEncoding()));

:
out.flush();
---------------------------
ちなみに、JSP にフォワードする場合は response の outputstream はいじらないようにしましょう。
しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2001-09-21 13:35
あ…ミス…

response.setContentType("text/html charset=Shift_JIS");
→ response.setContentType("text/html; charset=Shift_JIS");

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