Servlet日記(1999/02/06)

本日の成果

 以前、amazon.comで頼んでいた、Servlet Programmingの本が届きました。表紙には上等なやかんが描かれているので、これは「やかん本」と呼ぶのでしょうか。内容はまだちゃんと読んでいないのですが、ぱらぱらと見た感じはO'Reillyらしく、読むと賢くなれるかも、と思わせる出来です。

 本日のservletは、PrintWriterがcharsetを見ているかどうか確認するものです。「やかん本」の付録Eにも書いてあるのですが、content-typeでcharsetを指定すると、PrintWriterはそれを見て出力する漢字コードを切り替えるということです。getWriterメソッドを呼び出す前に、charsetを指定する必要があるそうです。doGetメソッドとして以下のようなプログラムを作ってみました。今までとの違いは、content-typeにcharsetを指定したこと、出力に日本語を使っていること、out.close()を呼び出していないことです。out.close()を呼び出した時点で応答を返し、呼び出さなければこのメソッドの実行後に自動的に応答を返すらしいので、今回は呼ばないことにしました。

 これを、ぼんやりと、シフトJISで保存してコンパイルしてWebブラウザからアクセスすると、ちゃんとEUCで出力しているようです。Webブラウザは漢字コードを賢く変換してしまうことがあるので、念のためにtelnetで確認してみましたが、大丈夫なようです。charsetをISO-2022-JPやShift_JISにしても、それぞれ正しく変換されています。

 が、よくよく考えてみると、ソースコードをシフトJISで書いて問題ないのでしょうか。Javaで日本語を使うには、Unicodeで書く必要があると聞いたことがあるような気がするので、Unicodeで保存してコンパイルしてみると、「入力文字が無効です」という日本語のエラーメッセージが出てしまいます。ちなみに、ソースコードをJISやEUCで保存してみると、コンパイルエラーは出ませんが、出力は文字化けしてしまいます。ということは、ソースコードは必ずシフトJISで書く、というのが結論ですが、ううむ・・・。しかも、エラーメッセージが日本語になっています。そういえば、インストール時の画面も日本語で表示されたので、Windows用の日本語版(?)JDKはそうなっているのかもしれません。そうだとすると、これで中国語や韓国語を表示するプログラムを作成したいときはどうすれば・・・?

{
    res.setContentType("text/html; charset=EUC-JP");
    PrintWriter out = res.getWriter();

    out.print("<html><head><title>こんにちは!</title></head>");
    out.print("<body>こんにちは! EUC版です</body></html>");
}

本日の教訓

 charsetを指定すると、PrintWriterは漢字コードの変換を行ってくれる。しかし、そのためには、ソースコードをシフトJISで書こう。

Servlet日記(1999/02/02) Servlet日記の目次 Servlet日記(1999/02/07)