• 締切済み

困ってます

HTMLファイルのフォームのパラメータをサーブレットに引渡し、サーブレット内で、ファイルに出力(CSV形式)したいのですが、日本語が含まれていると文字化けしてしまいます。 文字化け防止の為に下記のようなコードを書いているのですが、うまくいきませんでした。(フォームの"name"というパラメータをサーブレットに渡します。) ----------------------------------------------------- (サーブレットのファイルより一部抜粋) //変数&定数の宣言 private static final String csvFile = "/home/csvFile.csv"; String name; FileWriter fw = new FileWriter(csvFile); PrintWriter pw = new PrintWriter(fw); //☆文字化け防止コード name = request.getParameter("name"); name = new String(name.getBytes("8859_1"),"SJIS"); //ファイルに出力 pw.print(name + ","); pw.close(); ----------------------------------------------------- 上記のようなコードの書き方だと駄目でしょうか? ちなみに"SJIS"を"euc-jp"、"JisAutoDetect"に変えてもうまくいきませんでした。 実行方法は (1).windowsでサーブレットをコンパイルし、 (2).(1)で出来たクラスファイルをLinuxに転送し、 (3).Linux上でTomcatの再起動をして実行しています。 もし何か分かることがありましたらご教授お願い致します。

  • Java
  • 回答数3
  • ありがとう数1

みんなの回答

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.3

"8859_1"という、欧米向けのエンコーディングを経由しているのが いけないのだと思います。 FileOutputStream fos = new FileOutputStream(csvFile); OutputStreamWriter osw = new OutputStreamWriter(fos, "SJIS"); name = request.getParameter("name"); osw.write(name, 0, name.length()); osw.write(",", 0, 1); osw.close(); ではどうでしょう。 上のoswを引数にしてPrintWriterのインスタンスを作る手もあります。 yuxpさんの回答に近くなりますが。(yuxpさんの回答自体は、 FileWriterを引数に取るOutputStreamWriterのコンストラクタはない と思いますが。) また、madmanさんの仰っているのはURLエンコーディングのことだと 思います。考慮しておくのは必要ですが、requestのクラスが書いて いないので、とりあえず解決済みのこととして扱いました。

  • yuxp
  • ベストアンサー率58% (7/12)
回答No.2

PrintWriter out = new PrintWriter(new OutputStreamWriter(new FileWriter(csvFile), "SJIS")); にしてみたらどうでしょう? "SJIS"の部分を"euc-jp"にすればEUCで書き込まれると思います。

  • madman
  • ベストアンサー率24% (612/2465)
回答No.1

WEBのフォームに入力される文字は通常base64エンコードされていますので、 base64デコードする必要があります。 漢字で「あいう」と入っている場合は、jisであれば82A082A282A4という16進コードであらわされます。これが「%82%A0%82%A2%82%A4」という文字列に変換されます。 これらのことは、考慮されていますか?

関連するQ&A

  • Java・ファイルへの書き込み

    はじめまして。 下記のプログラムで、以下の3つがどのような関係なのかがわかりません。 ("test1.txt")とnew FileWriterの関係 (new FileWriter("test1.txt")とnew BufferedWriterの関係 (new BufferedWriter(new FileWriter("test1.txt")と new PrintWriterの関係 どうかご教示いただきたく、よろしくお願い致します。 import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; public class Sample7 { public static void main(String[] args){ PrintWriter pw = null; try{ pw = new PrintWriter (new BufferedWriter(new FileWriter("test1.txt"))); pw.println("Hello!"); pw.println("GoodBye"); System.out.println("ファイルに書き込みました。"); }catch(IOException e){ System.out.println("入出力エラーです。"); }finally{ if(pw != null){ pw.close(); } } } }

    • ベストアンサー
    • Java
  • Writer & PrintWriter

    import java.io.*; public class JavaIO4 { public static void main(String args[]) throws Exception { Writer w=new FileWriter(args[0]); PrintWriter pw=new PrintWriter(w); for (int i=0; i<=330; i+=30) { double atai=Math.sin(Math.PI*i/180.0); String str="sin("+i+")="+atai+"\n"; pw.write(str); } pw.close(); } } と import java.io.*; public class JavaIO4 { public static void main(String args[]) throws Exception { //Writer w=new FileWriter(args[0]); PrintWriter pw=new PrintWriter(args[0]); for (int i=0; i<=330; i+=30) { double atai=Math.sin(Math.PI*i/180.0); String str="sin("+i+")="+atai+"\n"; pw.write(str); } pw.close(); } } の結果が同じになるんですけど、 Writer w = new FileWriter(args[0]); PrintWriter pw = new PrintWriter(w); とするのはなぜなんですか? 何か意味はあるんですか?

  • ファイル出力時の

    以下のソースでファイル出力するのですが、 BufferedReader br = new BufferedReader(new FileReader(new File(args[0]))); PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(args[1]))); //一行読み込みを行った文字列を格納 String line; //一行読み込み while((line = br.readLine()) != null){ //一行書き込み pw.write(line); System.out.println(line); } コンソールへの出力は正常に出力されるのですが、 ファイルへの出力は改行されずに一行で出力されてしまいます。 どうすればファイル出力も正常になるか教えてください。

  • JavaのFileWriterについて

    はじめまして。 以下のようなプログラムで、new FileWriter("test1.txt")の【test1.txt】が最終的にどの親クラスのコンストラクタ(メソッド?)に渡されて処理されるのかがわかりません。 new演算子で FileWriterオブジェクトを作成した際に、importした親クラスのFileWriterクラスにあるコンストラクタが呼び出されるのだろうとは思っています。 そこで、JavaのAPIのサイトにて、クラス FileWriterの説明(http://docs.oracle.com/javase/jp/6/api/)を読みましたが、コンストラクタが複数紹介されており、下記のプログラムに当てはまるものがどれか分かりませんでした。 また、クラス FileWriterの説明ページのコンストラクタの概要にあるpublic FileWriter(File file)というコンストラクタの場合、引数リストのFileにもリンクがあり、Fileのリンク先のページであるクラス Fileの説明(http://docs.oracle.com/javase/jp/6/api/)を読みましたが、結局test1.txtがどのクラスのコンストラクタ(メソッド?)でどのように処理されているのかが分かりません。 どうかご教示いただきたく、よろしくお願い致します。 import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; public class Sample7 { public static void main(String[] args){ PrintWriter pw = null; try{ pw = new PrintWriter (new BufferedWriter(new FileWriter("test1.txt"))); pw.println("Hello!"); pw.println("GoodBye"); System.out.println("ファイルに書き込みました。"); }catch(IOException e){ System.out.println("入出力エラーです。"); }finally{ if(pw != null){ pw.close(); } } } }

    • ベストアンサー
    • Java
  •  DataをtxtFileに書かせて、同じFileから読み込みです、エラーの意味が不明です

    JAVA初心者です、宜しくお願いします。  DataをtxtFileに書かせて、同じFileから読み込ませるコードですが、書き込みは正常に出来、(test1.txt)Fileも出来、内容もOKなのですが、同じFileからの読み込みがエラーになります。 一体どこが間違っているのでしょうか。 Fileは同じプロジェクトにおいています。(当然同一Fileからの読み込みです。) 諸兄の方々宜しくお願いします・・・正直泣いています。 public class Write_Read_070620{ public static void main(String args[]){ try{ PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("test1.txt"))); pw.println("Hello!!"); pw.println("Goodbye!!"); pw.close(); BufferedReader br0 = new BufferedReader(new FileReader("text1.txt")) ; String str0 = br0.readLine() ; System.out.println("入力データーを確認します\n" + " Team " + str0); br0.close(); } catch(IOException e){ System.out.println("入力エラ-です。\n "); } } }

    • ベストアンサー
    • Java
  • LAN接続された外部フォルダに出力したい

    お世話になります。 ローカルで作成したClassファイルを使って、ローカルにあるExcelファイルをLAN上にあるサーバのフォルダにファイルコピーしたいのですが、やり方がわかりなくて困ってます。 同一PC上だと final String output = "C:\\MyDoc\\test\\test.xls"; と、宣言しておいて PrintWriter pw = new PrintWriter(new FileWriter(output))); のように記述して出力できてます。 単純に考えると、パスを切る宣言でサーバのパスを切ればいいのかと思い、そうしてみましたが上手くいきません。 いい方法をご存知でしたらお教えください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • ファイル出力クラスの選択について(Java)

    少し長文になります。 Javaで、複数のオブジェクトに格納された文字列をループでgetして、 1つのファイル(test.txt)内に出力していくプログラムを作っています。 ファイル出力する際に使用可能なクラスがいくつもあるため、 どれを選択すればいいのか迷ってます。 以下の条件から、使用すべきクラスを教えて下さい! <ファイル出力の条件> ーーーーーーーーーーーーーー 1. ファイル(test.txt)は毎回新規で1ファイルのみ作成して、   そのファイル内にオブジェクトからループでgetした文字列を1行ずつ出力していく。   (次回実行の直前に、前回のtest.txtは手動削除する。) 2. test.txt内には日本語が出力される可能性があり、且つ、   test.txtをWindowsのアプリケーションで利用するため、   SJISにエンコードして出力する。   ※Javaの実行環境はLinux 3. バッファを使って出力する。 ーーーーーーーーーーーーーー 以上です。 私の考えでは、全てキャラクタストリームを使って、 ---------- FIleWriter fw = new FileWriter("test.txt",true);  OutputStreamWriter osw = new OutputStreamWriter(fw,"SJIS"); BufferedWriter bw = new BufferedWriter(osw); ---------- でいいのかなと思ったのですが、 ネットを見ていると ---------- FileOutputStream os = new FileOutputStream("output"); OutputStreamWriter osw = new OutputStreamWriter(os, "JIS"); BufferedWriter bw = new BufferedWriter(osw); PrintWriter pw = new PrintWriter(bw); ---------- という記述もあり、 わざわざキャラクタストリームとバイトストリーム(FileOutputStream)を混ぜて使っている意図もよく分かりません。 (文字列を扱うのに、バイトストリームを使う意味って無いですよね??) それから、私の例では FIleWriterインスタンス生成時の引数で"true"を指定して test.txtに"追記"するように設定してますが、 test.txt自体は毎回新規作成のものを使うので、この場合trueもfalseも不要でしょうか?? (→認識の確認として、 「trueやfalseはあくまで既存ファイルに対しての追記/上書きの設定であって、 ファイルをオープンしてクローズするまでの間はtrueなど設定しなくても ずっと末尾に追記されていく」という認識でOK?) また、true/falseが不要な場合、 FIleWriterは使わずに、 ---------- OutputStreamWriter osw = new OutputStreamWriter("test.txt","SJIS"); BufferedWriter bw = new BufferedWriter(osw); ---------- としても問題無いでしょうか?? 以上、分かる方、アドバイスください!

    • ベストアンサー
    • Java
  • サーブレットでFileWriterクラスの出力先変更。

    サーブレットでFileWriterクラスの出力先変更。 はじめて質問させていただきます。 サーブレットでFileWriterクラスを利用して ログを出力していますが 出力変更設定がわかりません。 現在は C:\Program Files\Apache Group\Tomcat 4.1に出力されます。 お手数ですがご教授お願い致します。 ソース try{ // デバッグモードでない時はファイル出力なし、デバッグ時のみファイル出力する if ( dbg_flag == false ){ return; } String strMsg = DateFormat.getDateTimeInstance().format(new Date()) + "[" + clsname + "]" + msg; System.out.println(strMsg); // ファイルライターを開く fw = new FileWriter(filename,true); // ファイルライターに書き込み fw.write(strMsg + "\n"); // フラッシュする fw.flush(); } catch(Exception ex){ return; } finally{ try { // 最後にファイルライターを閉じる if( fw != null) fw.close(); } catch(Exception ex){ return; } } java 1.3.1_01 tomcat 1.4

    • ベストアンサー
    • Java
  • テキストBOXから取得した文字コードの扱いについて

    JSPで記述したページのテキストBOXに入力されたSJIS形式の日本語文字データをサーブレットに送信してそれを取得して、文字のエンコードを行う際に気がついたのですが String text = request.getParameter("text"); byte[] bytes =text.getBytes("ISO8859_1"); text=new String(bytes, "SJIS"); のようにすればサーブレットで扱う時に正しく日本語表示できるのですが String text = request.getParameter("text"); byte[] bytes =text.getBytes("SJIS"); text=new String(bytes, "SJIS"); とすると正しく表示されません。 text.getBytes("SJIS");で取得格納されるbyteのデータに違いがあるようです。この場合取得されるbyteの配列は3つになっています。 ISO8859_1で取得するとbyte配列は2つになっています。このISO8859_1のbyte配列のデータと同じ中身のものを単にString(byteデータ,文字コード)のコンストラクタに入れるとSJISの文字コードで正しく変換出来ています。 要するにもともとSJISの文字データをgetByte("SJIS")で変換したものがなんで、もとに戻せないのかということです。また、違う文字コードのISO8859_1ではSJISに対応したbyteの配列になるのかということです。 ひどい乱文ですみませんが、よろしくお願いします。

  • 困ってます。

    文字化けについて分からない事があります。 環境は RedHatLinux7.2, Postgresql7.1, Tomcat3.2.4, JDK1.4.0 です。 HTMLフォームで入力されたパラメータをサーブレットで受け取り、そのパラメータをDBのテーブルにSQLのINSERT文でデータを追加する際に日本語の部分(例:氏名)が文字化けしてしまいます。 文字化けの防止策として、 (1)String KANJINAME = new String(request.getParameter("KANJINAME").getBytes("8859_1"), "JISAutoDetect"); (2)String KANJINAME = new String(request.getParameter("KANJINAME").getBytes("8859_1"), "EUC-JP"); としても、文字化けしてしまいました。 今までサーブレット、JSP等で上記の(1)、(2)のような方法で文字化けを防いできたのですが、今回のようにDBのテーブルにInsert文で日本語を含んだデータを追加しようとすると文字化けしてしまいました。 これはコーディングの問題なのでしょうか?それともTomcat,Linux,Postgresqlに何らかの設定等が必要なのでしょうか? もし何か分かることがありましたら、ご教授お願い致します。