• 締切済み

サーブレットで文字化け

サーバ 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);

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

みんなの回答

  • t_wada
  • ベストアンサー率50% (3/6)
回答No.2

Servletを利用している場合、クライアントとの文字コードの差を吸収するには、主にフィルタを利用します。 クライアントの文字コードがSJISの場合、HttpServletRequestの文字コードがSJISになっています。 その為、Servlet側がUTF-8の場合、HttpServletRequestの文字コードをsetCharacterEncodingで変更してあげる必要があります。 これを全てのServletに記述するのは、メンテナンス性が非常に悪いので、Servletの処理が行う前にフィルタを使用して文字コード変換処理を噛ませてあげれば、フィルタが指定されているServlet全ての文字コードを変換することが出来ます。 ↓のURLを参考にしてみて下さい。

参考URL:
http://www.hellohiro.com/filter.htm
  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.1

送信側と受信側の文字エンコードに食い違いがあるからでしょ。

osiete_kun
質問者

補足

どうしたらいいですか? どこを変えればいいですか? どの部分をどうかえればいいですか?

関連するQ&A

  • 文字化けします。

    お世話になります。 ソケットでサーバとクライアントを接続しています。 コーディングの概略は次の通りです。 【クライアント】 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
  • サーブレットについて

    public class Server extends HttpServlet { PrintWriter out; BufferedReader in; String s; public void doGet(HttpServletRequest req, HttpServletResponse res)throws ServletException,IOException { in = new BufferedReader(new InputStreamReader(req.getInputStream())); out = new PrintWriter(res.getOutputStream(),true); //文字列受信 s = in.readLine(); //送信 out.println(s); } } tomcatはマルチスレッドだと聞いたわけですが、このプログラムで、例えば、トムがアクセスしてきて、 s=in.readLine(); が実行されている間に2番目に接続してきたネコが out=new PrintWriter(); を実行してしまって out.println(s);で後から接続してきたネコに送信されるとゆうこともあるわけでしょうか?

    • ベストアンサー
    • 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(); } }

  • 三つの文字を順に並べるプログラム

    三つの文字を入力して、順番に並べて表示させるプログラムが作りたいのですが、どうしたらいいのかわかりません。 二つまではできました。以下に記します import java.io.*; class Sample { public static void main(String args[]) throws IOException { System.out.println("文字列1を入力してください。"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1=br.readLine(); System.out.println("文字列2を入力してください。"); String str2=br.readLine(); int s = 1,t = 0; if(str1.length()>str2.length()){ int len=str1.length(); StringBuffer sb=new StringBuffer(str1); while(s<len+1){ sb.insert(s,str2.charAt(t)); s=s+2; t++; } System.out.println("文字列は"+sb+"となる。"); }else{ int len=str2.length(); StringBuffer sb=new StringBuffer(str2); while(s<len+1){ sb.insert(s-1,str1.charAt(t)); s=s+2; t++; } System.out.println("文字列は"+sb+"となる。"); } } } str1に123 str2に45といった風に入力すると14253といった風になります。 これにstr3を加え、str3が6789ならば、146257389 となる風にしたいです。

    • ベストアンサー
    • Java
  • 文字列の比較について

    BufferedReaderでファイルを読んだのちに、見出しの文字列をカンマで分割して 文字列を比較しようとしています。 ですが、分割すると、文字列が別な文字コードによる表記に変わってしまいます。 なぜでしょうか? また、解決方法などのヒントなどあれば教えてください。 BufferedReader buffReader = new BufferedReader( new FileReader("/home/masa/Desktop/Sample.csv")); String s; int ini=0; int wamei=0; int i=0; while((s = buffReader.readLine())!= null){ String[] str = s.split(",", -1); //System.out.println(s); if (i == 0) { for(int j=0; j<str.length;j++){ System.out.println(String.toString(str)); if(str.equals("五十音")){ini = j;} System.out.println("五十音"+ini); if(str.equals("a")){wamei = j;} System.out.println("和名"+wamei); //System.out.println(j); } } i++;

    • ベストアンサー
    • Java
  • 文字化けについて

    以下のコードでコンパイルすると 文字化けします。 どうすれば文字化けしなくできますか? new InputStreamReader(System.in)のところもEUC_JPにしたりしたのですが文字化けしてしまいました(汗) import java.io.*; public class test { public static void main(String agrs[]) { try { BufferedReader in=new BufferedReader(new InputStreamReader(System.in)); String boyname,girlname; int goukei=0; System.out.println("男性の名前を入力してください"); boyname=in.readLine(); System.out.println(boyname); char boynameChar[]=boyname.toCharArray(); for(int i=0;i<boyname.length();i++) { goukei+=(int)boynameChar[i]; } System.out.println("女性の名前を入力してください"); girlname=in.readLine(); char girlnameChar[]=girlname.toCharArray(); for(int i=0;i<girlname.length();i++) { goukei+=girlnameChar[i]; } System.out.print(boyname+""と+girlname+"の相性は"+goukei%100+"%"); in.close(); } catch(IOException e) { } } }

  • 文字化けについて

    以下のコードでコンパイルして日本語入力すると 文字化けします。 どうすれば文字化けしなくできますか? new InputStreamReader(System.in)のところもEUC_JPにしたりしたのですが文字化けしてしまいました(汗) import java.io.*; public class test { public static void main(String agrs[]) { try { BufferedReader in=new BufferedReader(new InputStreamReader(System.in)); String boyname,girlname; int goukei=0; System.out.println("男性の名前を入力してください"); boyname=in.readLine(); System.out.println(boyname); char boynameChar[]=boyname.toCharArray(); for(int i=0;i<boyname.length();i++) { goukei+=(int)boynameChar[i]; } System.out.println("女性の名前を入力してください"); girlname=in.readLine(); char girlnameChar[]=girlname.toCharArray(); for(int i=0;i<girlname.length();i++) { goukei+=girlnameChar[i]; } System.out.print(boyname+""と+girlname+"の相性は"+goukei%100+"%"); in.close(); } catch(IOException e) { } } }

    • ベストアンサー
    • Java
  • javaのメールクライアント

    メールの閲覧ができるプログラムを作成していますが閲覧ができずエラーが出てしまいます。 正しいソースコードを教えてください。 import java.io.*; import java.net.*; public class mail2 { public static void main(String args[]) throws IOException { String server,user,pass,str,num; int port = 110; StringBuffer sb = new StringBuffer(""); Socket sock; BufferedReader sockin; BufferedWriter sockout; System.out.println("サーバーを入力"); BufferedReader serverin = new BufferedReader(new InputStreamReader(System.in)); server = serverin.readLine(); System.out.println("ユーザーを入力"); BufferedReader userin = new BufferedReader(new InputStreamReader(System.in)); user = userin.readLine(); System.out.println("パスワードを入力"); BufferedReader passin = new BufferedReader(new InputStreamReader(System.in)); pass = passin.readLine(); try { sock = new Socket(server, port); sockin = new BufferedReader(new InputStreamReader(sock.getInputStream())); sockout = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); sockout.write("USER " + user + "\r\n"); sockout.flush(); sockout.write("PASS " + pass + "\r\n"); sockout.flush(); sockout.write("LIST\r\n"); sockout.flush(); sockout.write("QUIT\r\n"); sockout.flush(); while ((str = sockin.readLine()) != null) { System.out.println(str); } sock.close(); } catch (Exception ex) { ex.printStackTrace(); } System.out.println("どのメールを見ますか?"); BufferedReader numin = new BufferedReader(new InputStreamReader(System.in)); num = numin.readLine(); try { sock = new Socket(server, port); sockin = new BufferedReader(new InputStreamReader(sock.getInputStream())); sockout = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); sockout.write("USER " + user + "\r\n"); sockout.flush(); sockout.write("PASS " + pass + "\r\n"); sockout.flush(); sockout.write("LIST\r\n"); sockout.flush(); sockout.write("QUIT\r\n"); sockout.flush(); while ((str = sockin.readLine()) != null) { System.out.println(str); } sock.close(); } catch (Exception ex) { ex.printStackTrace(); } System.out.println("どのメールを見ますか?"); BufferedReader numin = new BufferedReader(new InputStreamReader(System.in)); num = numin.readLine(); try { sock = new Socket (server, port); sockin = new BufferedReader(new InputStreamReader(sock.getInputStream())); sockout = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); sockout.write("USER " + user + "\r\n"); sockout.flush(); sockout.write("PASS " + pass + "\r\n"); sockout.flush(); sockout.write("RETR " +num+"\r\n"); sockout.flush(); sockout.write("QUIT\r\n"); sockout.flush(); while ((str = sockin.readLine()) != null) { System.out.println(str); } sock.close(); } catch (Exception ex) { ex.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • Javaの簡易クライアント

    メールの閲覧ができるプログラムを作成してコンパイルして実行はできるのですが閲覧ができずエラーが出てしまいます。 正しいソースコードを教えてください。プログラムに詳しい方宜しくお願いします。 画像は実行結果です。 import java.io.*; import java.net.*; public class mail2 { public static void main(String args[]) throws IOException { String server,user,pass,str,num; int port = 110; StringBuffer sb = new StringBuffer(""); Socket sock; BufferedReader sockin; BufferedWriter sockout; System.out.println("サーバーを入力"); BufferedReader serverin = new BufferedReader(new InputStreamReader(System.in)); server = serverin.readLine(); System.out.println("ユーザーを入力"); BufferedReader userin = new BufferedReader(new InputStreamReader(System.in)); user = userin.readLine(); System.out.println("パスワードを入力"); BufferedReader passin = new BufferedReader(new InputStreamReader(System.in)); pass = passin.readLine(); try { sock = new Socket(server, port); sockin = new BufferedReader(new InputStreamReader(sock.getInputStream())); sockout = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); sockout.write("USER " + user + "\r\n"); sockout.write("PASS " + pass + "\r\n"); sockout.write("LIST\r\n"); sockout.write("QUIT\r\n"); sockout.flush(); while ((str = sockin.readLine()) != null) { System.out.println(str); } sockout.close(); sockin.close(); sock.close(); } catch (Exception ex) { ex.printStackTrace(); } System.out.println("どのメールを見ますか?"); BufferedReader numin = new BufferedReader(new InputStreamReader(System.in)); num = numin.readLine(); try { sock = new Socket (server, port); sockin = new BufferedReader(new InputStreamReader(sock.getInputStream())); sockout = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); sockout.write("USER " + user + "\r\n"); sockout.write("PASS " + pass + "\r\n"); sockout.write("RETR " +num+"\r\n"); sockout.write("QUIT\r\n"); sockout.flush(); while ((str = sockin.readLine()) != null) { System.out.println(str); } sockout.close(); sockin.close(); sock.close(); } catch (Exception ex) { ex.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • キーボードから文字列を入力する際の質問です。

    キーボードから文字列を入力する際の質問です。 どうしてもカタカナでしか日本語の入力が出来ません。 ローマ字入力です。 import java.io.*; class Sample4 { public static void main(String args[]) throws IOException { System.out.println("文字列を入力してください。"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); System.out.println(str + "が入力されました。"); } }

    • ベストアンサー
    • Java

専門家に質問してみよう