• ベストアンサー

文字化けを直したい

以下のようなHTMLから対象サイトの本文を取得するプログラムを作成しました。 import java.net.*; import java.io.*; import java.util.regex.*; public class GetBloghonbun { public static void main(String args[]) { String url = args[0]; boolean flag=false; try { String aLine; byte buf[] = new byte[4096]; URL u = new URL(url); DataInputStream di = new DataInputStream(u.openStream()); BufferedReader reader = new BufferedReader(new InputStreamReader(di)); while((aLine=reader.readLine())!=null) { if(aLine.indexOf("<div class=\"main\">") >=0){ flag=true; } else { if(flag && aLine.indexOf("<div class=\"posted\">")>=0) break; } if(flag==false) continue; Pattern pattern = Pattern.compile("<.+?>", Pattern.DOTALL); Matcher matcher = pattern.matcher(aLine); String string = matcher.replaceAll(""); System.out.println(string); } } catch(Exception e) { System.out.println("例外" + e + "が発生しました"); } } } このプログラムを次のサイト(ブログ)について実行しました。 http://blog.livedoor.jp/takapon_ceo/archives/50035965.html しかし、実行結果として、文字化けした結果の出力となりました。 対象サイトがEUCなので、それをSjisに直せばよいのでしょうか? 実行結果が文字化けしないようにするには、 どのようにプログラムを組めばよいでしょうか? よろしくお願いします。

  • shows
  • お礼率96% (48/50)
  • Java
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

対象サイトがEUCとわかっているなら 安易な方法としては BufferedReader reader = new BufferedReader(new InputStreamReader(di,"euc-jp")); にするだけでいいですが

shows
質問者

お礼

ご回答ありがとうございます。 問題を解決することができました。

その他の回答 (1)

  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.2

HTMLの文字コードを自動で判断しようとするとちょっとばかり面倒です。 というのは、文字コードはHTMLの中に書いてあるからです。 また、JAVAで文字ストリームを開くときには、文字コードを指定する必要があります。 つまり、文字コードを取得するために一度空読みし、文字コードの判明後にもう一度読むというような作業になります。 整理すると、 1.InputStreamを読み込んでそのままメモリに蓄える。 2.ある程度の大きさになるようなら、一時ファイルに切り替える 3.蓄えたHTMLを読んで文字コードを判別する。 4.蓄えたHTMLからReaderを作って文字処理を行う。 といった手順になると思います。 面倒なら、文字ストリーム開くときに、文字コードの自動判断というのもありますが、完璧ではありません。 どっちを採用するかは、作る人の判断でしょう。

shows
質問者

お礼

ご回答ありがとうございます。 今のところ、対象のサイトに対して自動で文字コードを判別させる処理は行わないつもりですが、 将来的にはそのようにしたいと思っております。 その際にとても参考になるアドバイスとなりました。 とても丁寧なご回答ありがとうございました。

関連するQ&A

  • 文字化けを直したい(Unicode(UTF8)の場合)

    以下のようなHTMLから対象サイトの本文を取得するプログラムを作成しました。 import java.net.*; import java.io.*; import java.util.regex.*; public class GetBloghonbun { public static void main(String args[]) { String url = args[0]; boolean flag=false; try { String aLine; byte buf[] = new byte[4096]; URL u = new URL(url); DataInputStream di = new DataInputStream(u.openStream()); BufferedReader reader = new BufferedReader(new InputStreamReader(di)); while((aLine=reader.readLine())!=null) { if(aLine.indexOf("<<DIV CLASS=POST_BODY>") >=0){ flag=true; } else { if(flag && aLine.indexOf("<<DIV CLASS=POST_TAIL>")>=0) break; } if(flag==false) continue; Pattern pattern = Pattern.compile("<.+?>", Pattern.DOTALL); Matcher matcher = pattern.matcher(aLine); String string = matcher.replaceAll(""); System.out.println(string); } } catch(Exception e) { System.out.println("例外" + e + "が発生しました"); } } } このプログラムを次のサイト(ブログ)について実行しました。 http://blog.excite.co.jp/haagen-dazs/1632409/ しかし、対象サイトがUnicode(UTF8)なので実行結果として、 文字化けした結果の出力となりました。 対象サイトがEUCの場合には、 BufferedReader reader = new BufferedReader(new InputStreamReader(di,"euc-jp")); とすればよいと以前に同様の質問をした際に教えていただきました。 対象サイトがUnicode(UTF8)の場合に、 実行結果が文字化けしないようにするには、 どのようにすればよいでしょうか? よろしくお願いします。

    • ベストアンサー
    • 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
  • Java正規表現-"ある文字列"を含まない文字列

    Javaの正規表現で、HTMLタグ以外の文字列を抽出しようとしています。 HTMLタグはの正規表現は"(</?.*>)"のように表しました。これの否定をしたいのですが、方法を教えて下さい。HTMLタグ以外にヒットさせたいです。 一応、現段階のソースを載せます。 import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; public class HTMLInnerGetter { public static void main(String[] args){ String regex = "(</?.*>)"; String target = "<html><head><title>title</title></head><body><h1>head1<br><p>pragraph</p></body></html>"; ArrayList<String> innerHTMLs = new ArrayList<String>(); Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(target); while(matcher.find()){ innerHTMLs.add(matcher.group(1)); } System.out.println(innerHTMLs); } } 出力結果 [<html><head><title>title</title></head><body><h1>head1<br><p>pragraph</p></body></html>] ※否定できなかったので、HTMLタグがヒットしています。

    • ベストアンサー
    • Java
  • handleText()で取得したテキストが文字化けしてしまいます。

    タイトルの通りです。入出力について一応自分なりに調べてみましたが、出力したファイルへの文字化けが直りません。下にコードを書いています。 どうかよろしくお願いします。 import java.io.*; import java.net.*; import javax.swing.text.MutableAttributeSet; import javax.swing.text.html.*; import javax.swing.text.html.parser.ParserDelegator; class MyParserCallback extends HTMLEditorKit.ParserCallback { String[] text = new String[1000]; int k=0; public void handleText(char[] data, int pos) { text[k] = new String(data); k++; } } public class test { String[] line = new String[10000]; public test() { try { URL url = new URL("http://www.goo.ne.jp/"); HttpURLConnection uc = (HttpURLConnection) url.openConnection(); uc.setUseCaches(false); BufferedReader br = new BufferedReader(new InputStreamReader(uc .getInputStream())); BufferedWriter bout = new BufferedWriter(new FileWriter("test.txt")); MyParserCallback cb = new MyParserCallback(); ParserDelegator pd = new ParserDelegator(); pd.parse(br, cb, true); for(int i=0; i<cb.text.length; i++) { if(cb.text[i] == null) { continue; } bout.write(cb.text[i]); bout.newLine(); } //終了処理 br.close(); bout.close(); } catch (MalformedURLException e) { System.out.println(e); } catch (IOException e) { System.out.println(e); } } public static void main(String[] args) { test t = new test(); } }

    • ベストアンサー
    • Java
  • 「プログラミング」JAVAのエラーが解決できません。

    ホームページを見たり、メールチェックをしたり、数分間このプログラムを走らせると、 Address already in use: connect java や Connection refused: connect といったエラーメッセージが出ます。 どうすれば、解決するでしょうか? やさしいJAVAやインターネットで調べたのですが良い方法が分かりません。ぜひ、ご教示宜しくお願い致します。 import java.net.*; import java.io.*; import java.util.*; import java.text.*; class Test { public static void main(String[] args) throws Exception { String helloURL; for(int a=1; a<3000; a++) { helloURL = "http://shopping.yahoo.co.jp/"; Th th1 = new Th(helloURL); th1.start(); Thread.sleep(100); } } } class Th extends Thread { String helloURL = null; String line; Th(String str) { this.helloURL = str; } public void run() { try { URL url = new URL(helloURL); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(),"JISAutoDetect")); while ((line = in.readLine()) != null) { try { OutputStream os = new FileOutputStream("log.txt",true); BufferedWriter fr = new BufferedWriter(new OutputStreamWriter(os)); if(line.indexOf("ヤフー") != -1) { fr.write(line); } if(line.indexOf("あ") != -1) { fr.write(line); } fr.close(); os.close(); } catch(Exception e){System.out.println("エラー1 : "+e.getMessage());} } in.close(); } catch(Exception ex){System.out.println("エラー2 : "+ex.getMessage());} } }

    • ベストアンサー
    • Java
  • 同じブログサービスでもHTMLの構造が異なるブログからのトラックバック先のURLの取得

    以前の質問 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1725502 のNo.4のご回答を参考にして、 ブログのHTMLからトラックバックをしたブログのURLの取得するプログラムを作成しています。 しかし、ブログサービスによってはリニューアルの関係か、 新しいブログと古いブログではHTMLの構造が変わってしまい、 一つのプログラムでは対応できない場合がでてきました。 例えば、ヤプログを例にして説明します。 こちらのヤプログのブログhttp://yaplog.jp/lovery-honey/archive/27 のように比較的古くからのブログであれば 参考プログラムの正規表現のところを、 以下のようにすると、URLを取得できるのですが、 Pattern trackBack = Pattern.compile("<a href=\"(http://.+)\" target=\"_blank\">"); while((aLine = reader.readLine())!=null){ if(aLine.indexOf("<a id=\"trackback\">") >=0){ flag=true; } else { if(flag && aLine.indexOf("<!-- pings -->")>=0) break; } こちらのブログhttp://yaplog.jp/chikako/archive/19 のように比較的新しいブログでは、 HTMLの構造が変わってしまい、 Pattern trackBack = Pattern.compile("<a href=\"(http://.+)\" target=\"_blank\">"); while((aLine = reader.readLine())!=null){ if(aLine.indexOf("<a name=\"tb\">") >=0){ flag=true; } else { if(flag && aLine.indexOf("<div class=\"main_cl\">")>=0) break; } と、正規表現を上記のように記述しないとURLを取得できません。 そこで、ひとつのプログラムで、上記の二つのケースに対応するようにするには、 正規表現をどのように記述して、プログラムを改正すればいいでしょうか? よろしくお願いします。

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

  • 文字コードを変換する

    //このプログラムは、指定されたURLのソースを読むプログラムです。 import java.io.*; //入出力のAPIを実装するのに用います。 import java.net.*; //ネットワークに関するAPIを実相するのに用います。 import java.lang.*; class rss { public static void main(String args[]) { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); try{ System.out.println("読み込みたいRSSのURIを入力してください。"); String address = br.readLine(); //URLを標準入力から読み込みます。 URL url = new URL(address); InputStream uin = url.openStream(); BufferedReader in = new BufferedReader(new InputStreamReader(uin)); String source; //ソースファイル一行を格納する文字列変数です。 //指定したURLのソースファイル標準出力します。 while((source = in.readLine()) != null ){ System.out.println(source); } } catch(IOException e){ System.out.println("ソースを読みこめませんでした。"); } } } というプログラムを作ったのですが、 一部のソースファイルが文字化けを起こします。 そのソースがどの文字コードでできているか? そして、それをどうやったら変換したらいいかを 教えてほしいのです。 お願いします。

    • ベストアンサー
    • Java
  • Javaの問題について...

    import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.net.UnknownHostException; import javax.swing.JTextArea; public class html_getter { public static void main(String[] args){ Object o1 = null; try { o1 = new Getter5(new URL("http://www.google.com/")); } catch (MalformedURLException e) { e.printStackTrace(); } ((Getter5)o1).Show(); } } class Getter5{ private String charset = "Shift_JIS"; private JTextArea htmlArea; public Getter5(URL url){ htmlArea = new JTextArea(); try { URLConnection uc = url.openConnection(); BufferedInputStream bis = new BufferedInputStream(uc.getInputStream()); BufferedReader br = new BufferedReader(new InputStreamReader(bis, charset)); htmlArea.setText("");//初期化 String line; while ((line = br.readLine()) != null) { htmlArea.append(line + "\n"); } } catch (MalformedURLException ex) { htmlArea.setText("URLが不正です。"); ex.printStackTrace(); } catch (UnknownHostException ex) { htmlArea.setText("サイトが見つかりません。"); } catch (IOException ex) { ex.printStackTrace(); } } public void Show(){ System.out.println(htmlArea.getText()); } } このプログラムはURLの指定先からHTMLを取ってきて表示するプログラムなのですが、 これに「indexOfとString s1を使ってURLの指定先のHTMLから自分の入力した文字列があるかどうかを判断するプログラム」を作りたいのですがどうすれば作れるでしょうか?

  • 【初心者です】大文字←→小文字

    import java.io.*; public class ex52a { public static void main(String[] args) throws Exception { BufferedReader in = new BufferedReader(new InputStreamReader (System.in)); while(true) { System.out.print("String> "); String s = in.readLine(); if(s.equals("")) { break; } String res = ""; s = s.toUpperCase(); s = s.toLowerCase(); res = s; System.out.println(res); } } } これだと、大文字は小文字になるのに、小文字は大文字になりません。 単純に二つ並べるだけでは駄目なのでしょうか...

    • ベストアンサー
    • Java

専門家に質問してみよう