昨日に引き続き、POSTした内容を、ファイルに保存する処理の実現についてです。フォームに半角英数文字を書いた場合は、うまくファイルに保存されるものの、全角文字を書くと、文字化けしていました。原因を調べるために、req.getParameter("uName")で得られる文字列を調べてみると、フォームに全角文字で書いた場合、シフトJISでエンコードされていることがわかりました。(もちろん、一般的にこうなるというわけではなく、今回の実行環境での話です。)以前、Servlet日記(1999/02/06)で日本語文字列の出力を試したときは、ソースコードをシフトJISで書くとうまくいったので、getParameter()メソッドがシフトJISでエンコードされた文字列を返すのは正しいかもしれないと考え、出力のエンコードもシフトJISになるよう指定してみましたが、やはりうまくいきません。Javaの入門書を読むと、文字列は内部的にはUnicodeで格納されている、というように書いてあるので、どう考えても、getParameter()メソッドの戻り値(シフトJISでエンコードされている)をそのまま使うのは、まずそうです。文字化けしたのは、println()メソッドが、引数がUnicodeでエンコードされているとみなして、デフォルトのエンコードタイプ(シフトJISか?)に変換したためではないかと思います。本来なら、入力文字列を、いったんシフトJISからUnicodeに変換するべきのように思いますが、ここでは大幅に手抜きして、write()メソッドを使って、そのままバイナリデータとしてファイルに書くようにしてみました。すればシフトJISでファイルに出力するので、一応、文字化けせずに動くようです。以上の変更の結果、doPost()メソッドは次のようになりました。入力した文字列は、Unicodeでエンコードすべきではないか(まだ、よくわからない)。Servlet日記(1999/03/14)。