サーブレットで外部テキストファイルからの出力が文字化け

このQ&Aのポイント
  • サーブレットで、外部テキストファイルを読み込んで、HTMLとして出力する際に、日本語部分が文字化けする問題が発生しています。
  • 環境は、JDK:Java 6 Update 3、サーブレットコンテナ:GlassFish v2、OS:Windows XP Home SP2、開発環境:NetBeans 6.0 (+日本語言語パック)です。
  • ソースコードでは、外部テキストファイルを一行ずつ読み取り、出力する際に文字化けが発生しています。
回答を見る
  • ベストアンサー

サーブレットで外部テキストファイルからの出力が文字化け

 サーブレットで、外部テキストファイルを読み込んで、それをHTMLとして出力すると、日本語部分が文字化けしてしまいます。 外部ファイルの文字コードはUTF-8Nになっていますし、ブラウザで他の文字コード(Shift-JIS、EUC-JP)で表示するように指定しても、文字化けするだけでした。 なお、環境は、 JDK:Java 6 Update 3 サーブレットコンテナ:GlassFish v2 OS:Windows XP Home SP2 開発環境:NetBeans 6.0 (+日本語言語パック) ソースコードは以下のとおりです。 private void printFile(String filePath, PrintWriter out) throws FileNotFoundException, IOException{  FileReader file = new FileReader(getServletContext().getRealPath(filePath));   BufferedReader bfile = new BufferedReader(file);   //一行の文字列   String line;   while(true){    //ファイルから一行読み取る。読み取れなかったらループ終了。    if((line = bfile.readLine()) == null){    break;   }   //一行出力(ここは日本語が文字化け)   out.println(line);  }  bfile.close();  file.close(); } protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {   response.setContentType("text/html; charset=UTF-8");   PrintWriter out = response.getWriter();   //中略   out.println("<meta http-equiv=\"Content-Type\" " + "content=\"text/html; charset=UTF-8\">");   //中略   out.print("ここは正常に表示される");   //中略   printFile("/file.txt",out);//ここで日本語が文字化け } ・・・よろしくお願いいたします。

noname#82539
noname#82539
  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • thamansa
  • ベストアンサー率40% (95/232)
回答No.1

FileReaderはファイルがOSのデフォルトエンコード(SJIS)で書かれているものとして 読みますので、外部ファイルの文字コードがUTFの場合、FileReaderで読むと化けてしまいます。 InputStreamReaderを使ってファイルの文字コードを指定すれば読めるはずです。 BufferedReader bfile = new BufferedReader(new InputStreamReader(new FileInputStream(filename),"UTF-8"));

noname#82539
質問者

お礼

 ご回答ありがとうございます。うまくいきました!

関連するQ&A

  • サーブレットで文字化け

    サーバ Fedora Core 6 / tomcat5.5 クライアントもFedoraなら文字化けしません。 ウィンドウズxpから接続すると文字化けします。 アプレットのプログラムで送信する関数のみ抜粋した。引数sが送信する文字列でこれが文字化けします。送信した変数sをJLabelで表示するとウィンドウズでも文字化けしてなかった。そしてサーバー側のログは文字化けしていたのですが原因がわかりません。どうしたらいいですか? //■アプレット側 文字列送信用関数 public void send(String s) { try { sock = new Socket(サーバのIPアドレス,9999); //■サーバーに接続 fin = sock.getInputStream(); fout = sock.getOutputStream(); ffin = new InputStreamReader(fin); in = new BufferedReader(ffin); out = new PrintWriter(fout,true); out.println("POST / HTTP/1.1"); out.println("Accept: */* "); out.println("Accept-Language: ja"); out.println("Accept-Encoding: gzip,deflate"); out.println("User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"); out.println("Host: "+getParameter("ipAddress")); out.println("Content-Type: application/x-www-form-urlencoded; charset=UTF-8"); out.println("Content-Length: "+(s.getBytes("UTF-8").length)); out.println("Connection: Keep-Alive"); out.println(""); out.println(s); } catch(IOException e) { } } サーバー側 変数sの表示 public void service(HttpServletRequest req, HttpServletResponse res)throws ServletException,IOException { //■通信関係 PrintWriter out; BufferedReader in; //■入力した文字列 String st,str; try { //■通信開始 in = new BufferedReader(new InputStreamReader(req.getInputStream())); out = new PrintWriter(res.getOutputStream(),true); //■文字列読み込み st = in.readLine(); str = new String(st.getBytes("UTF-8")); System.out.println("受信した文字列"+str);

  • ファイル出力時の

    以下のソースでファイル出力するのですが、 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); } コンソールへの出力は正常に出力されるのですが、 ファイルへの出力は改行されずに一行で出力されてしまいます。 どうすればファイル出力も正常になるか教えてください。

  • Tomcat6.0 日本語が?に文字化け

    HelloWorld!!はろぅわーるど!! と書いてコンパイルすると、IEの画面で HelloWorld!!????????? と表示されます。 日本語というよりは2バイト文字が文字化けしているのかなと思います。 何が足りないのでしょうか。 どなたかよろしくお願いします。 全文はこんな感じです。 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { PrintWriter out = response.getWriter(); out.println("<html>"); out.println("HelloWorld!!はろぅわーるど!!"); out.println("</html>"); out.close(); } }

  • 文字化けします。

    お世話になります。 ソケットでサーバとクライアントを接続しています。 コーディングの概略は次の通りです。 【クライアント】 PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(),"EUC_JP")); out.println("かきくけこ"); System.out.println(in.readLine()); 【サーバ】 PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(),"Shift_JIS")); String inputLine; while ((inputLine = in.readLine()) != null) { System.out.println(inputLine); out.println(inputLine); //←これはクライアントでも文字化けしない。 String s1 = "あいうえお"; String u1 = new String(s1.getBytes("xxxxx"), "yyyyy"); out.println(u1); //←文字化けする。 } お伺いしたいのは文字コード変換についてです。 サーバ:RedhatLinux クライアント:Windowsでして、 サーバ側コーディングの String s1 = "あいうえお"; としている文字列を クライアント側の // 読み込んだデータを表示 System.out.println(in.readLine()); で表示したいのですが、文字が化けて(????←このようになります)困っています。 文字コード変換しなければいけないと思うのですが、 getBytesを使うのでしょうか? もしgetBytesを使うならどのように書けばいいのかがわかりません。 分かりにくい説明で申し訳ありませんが、 ご教授ください。宜しくお願いします。

    • ベストアンサー
    • Java
  • CSV読み込み 文字化け

    失礼いたします。 以前のログを見てエンコードを設定してみたのですが、出力が文字化けします。ローカルファイルを読み込んでコンソール出力しているだけなのですが・・・。 分かる方、よろしくお願いします。 -------------------ソースはここから import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; // import java.io.FileReader; FileReaderからInputStreamReaderに変更済み import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class ReadCSV { public static void main(String[] args) { try { File csv = new File("C:\\AP.csv"); // BufferedReader br = new BufferedReader(new FileReader(csv)); BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(csv),"EUC_JP")); // BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(csv),"MS932")); while (br.ready()) { String line = br.readLine(); StringTokenizer st = new StringTokenizer(line, ","); while (st.hasMoreTokens()) { System.out.print(st.nextToken() + "\t"); } System.out.println(); } br.close(); } catch (FileNotFoundException e) { キャッチ処理 }

    • ベストアンサー
    • Java
  • HttpのResponseが文字化け

    以下のプログラムの結果が文字化けします。 正しい文字コード(EUC-JP)にしているのですが 文字化けしてしまいます。 解消方法を教えて下さい。 ----- import java.net.*; import java.io.*; public class HelloWorldSocketClient { public static void main(String[] args) throws Throwable{ Socket socket = new Socket("www.sumishinam.co.jp", 80); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out.println("GET / HTTP1.0\n"); String buff; while((buff=in.readLine())!=null){ System.out.println(new String(buff.getBytes(),"EUC-JP")); } out.close(); in.close(); socket.close(); } }

  • サーブレットになったJSPの文字化け

    ローカルサーバーでwebサーバーを構築し、tomcatでサーブレットを動作させています。 ブラウザからのJSPに対するリクエストでサーブレットに変換されたコードに文字化けした 無駄な文字が入っていて原因が分かりません。 Windows2000 professional(SP4) apache tomcat5.5 struts-1.3.5 ※投稿文字数の制限で一部掲載です。 <<WEB-INF/jsp/abc.jsp>> 1:<%@ page language="java" contentType="text/html; charset=UTF-8" %> <--- この行がサーブレットになると文字化け 2:<%@ page import="java.net.URLDecoder" %> 3:<%@ taglib uri="/tags/struts-bean" prefix="bean" %> 4:<%@ taglib uri="/tags/struts-logic" prefix="logic" %> ~中略~ <<work/org/apache/jsp/abc.jsp>> ~中略~ 93: out = pageContext.getOut(); 94: _jspx_out = out; 95: 96: out.write("・ソ\r\n"); <<------"・ソ"と文字化けした無駄な文字が入る 97: out.write("\r\n"); 98: out.write("\r\n"); 99: out.write("\r\n"); 100: out.write("\r\n"); 101: out.write("\r\n"); 102: // bean:cookie 103 javax.servlet.http.Cookie cdata = null; 103: ~中略~ "・ソ"の"・"部分のコードは"EFBB"となっています。また、"ソ"は半角カナの"ソ"です。 この文字化けした無駄なコードがブラウザにも表示されてしまい、レイアウトの崩れと なっています。原因・対処法がおわかりになる方、ご回答お願いします。

    • ベストアンサー
    • Java
  • [perl5.8] utf8で文字出力すると文字化けする

    perl5.8で、テキストをunicode(utf8)で出力したのですが、文字化けします。 ソースは以下のとおりです。 -----ソース----- use open OUT => ":encoding(utf8)"; open(OUT, ">utf8.txt"); print OUT "utf8だよ\n"; close(OUT); ----------------- できたファイルはutf8エンコードなのですが、 エディタで見ると「だよ」が文字化けします。 ちなみにフリーソフトで、SJIS形式の「utf8だよ」が 書かれたファイルをutf8に変換すると、文字化けしません。 フリーソフトで生成したutf8ファイルと、 自作perlで生成したutf8ファイルとを バイナリエディタで読込み比較すると 75746638E381A0E382880D0A (フリーソフト) 75746638C282C2BEC282C3A60D0A (自作perl) という差が出ています。 原因がお分かりになる方、知恵をお貸し願えますか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • テキストファイルが文字化けし、エンコード不能に

     システムロケールを英語(英国)に変更したら、デスクトップ上に保存していたテキストファイルが文字化けしました。日本語に戻してもそのままの状態です。  IEでファイルを開き、右クリックでエンコードを選択して日本語(シフトJIS、EUC)に変換してもうまくいきません。  Web上の複数の変換ツール(UnicodeUTF-16やUTF-8を日本語に変換)にテキストを張り付けて変換しても同様です。  大切なファイルの2つが文字化けしたのですが、バックアップしておらず非常に困っています。  どなたか、元の文章を復元する知恵を貸していただけませんか?  一例として、1行目はこのようになっています。数字だけは、残っています。 「@ƒPƒ“ƒR[ƒRƒ€@@@2,205@‰»Ï•i 」  【備考】 ・ロケール変更は、BattleField4というゲームをする際に出るエラーを回避するために行いました。 ・IEでテキストファイルを開き、エンコードにカーソルをあわせると、「Unicode」に丸がついてグレーアウト表示されます。※Unicode(UTF-8)ではありません。

  • テキストエディターの文字化け

    素人の者です。 これまで、PHPのプログラムの書き込みをSJISで行ってきましたが、どうもネット上を調べているうちにSJISはあまり使わないほうが良いようなことが書いてあったので、UTF-8で書くことにしようと思いました。そして、UTF-8で書いていてWEB上は特に問題なく文字化けもせず表示されるのですが、テキストエディターで再度ファイルを開くと、テキストエディター内で文字化けしていることがあります。メモ帳で開くときはファイルの文字コートをUTF-8に指定すれば文字化けしません。サクラエディターで開けば、何もしなくても文字化けしません。php_editor_stdで開けば、文字化けします。ez-HTMLで開けば、文字化けします。???とこんな具合です。テキストエディターを開くときにエンコードを指定して開けば、文字化けはしないであろうと考えて、設定の部分を色々と探していじってみても、文字化けの現象は変わりません。SJISですと、ダメ文字とかあるのでやはり切り替えていったほうが良いと思い試している最中です。テキストエディターで文字化けした場合、どのようにすれば解消するのかお分かりになる方がおりました教えていただけないでしょうか。よろしくお願いいたします。

    • ベストアンサー
    • PHP