• ベストアンサー

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
  • 回答数3
  • ありがとう数3

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

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

InputStreamReader(uc.getInputStream(), "EUC-JP") で、エンコードを指定して取り込む

kamakuragengorou
質問者

お礼

ご返答ありがとうございます。 無事変換できました。 "EUC-JP"→"Shift-JIS"と再変換するのですね。まったく思いつきませんでした。ありがとうございました。

その他の回答 (2)

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

>どのページに書かれているのでしょうか? http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/nio/charset/Charset.html あたりかな・ >"EUC-JP"→"Shift-JIS"と再変換するのですね java では、ユニコードに変換されます。 出力にあたり、標準の(ソースが記述されたコード、あるいはオプションで指定されたコード)コード(この場合Shift_JIS)で出力されます。

kamakuragengorou
質問者

お礼

Charsetクラスに書かれてあったのですね。ご返答ありがとうございました。

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.1

>BufferedReader br = new BufferedReader(new InputStreamReader(uc.getInputStream())); ここでエンコーディングを指定していないのが原因です。 エンコーディングを指定しないと基本的にプラットフォームのデフォルトエンコーディングが使用されます。なので取得したコンテンツのエンコーディングとプラットフォームのデフォルトエンコーディングがあっていなければ文字化けが起こるのは当然です。 何の文字セットでエンコーディングをすればいいかはJavaDocを見ればわかると思います。

kamakuragengorou
質問者

お礼

ご返答ありがとうございます。 エンコーディング処理が必要なのですね。どうしても文字化けが直らずほんと困ってましたが、何とか直りました。 ちょっと気になったところがあったのですが、 >何の文字セットでエンコーディングをすればいいかはJavaDocを見ればわかると思います。 Javaのドキュメントにはそのようなことも書かれているのですね!しかしどのページに書かれているのでしょうか?どうしても見つけれませんでした。

関連するQ&A

  • テキストフィールドの文字をテキストエリアに表示する

    エラーも例外もないです。 但し今回の内容の"テキストフィールドに打ち込みエンターキーを文字をテキストフィールドに表示" が満たしてないですとりあえずソース乗せます mport java.awt.BorderLayout; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; public class MyMemo { public static void main(String[] args) { JFrame Frame = new JFrame("課題"); Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Frame.setSize(500, 500); Frame.setLocationRelativeTo(null); Container contentPane = Frame.getContentPane(); // テキストフィールドのインスタンスを生成 final JTextField text = new JTextField();// テキストエリアのインスタンスを生成 text.addActionListener(new MyActionListener()); Frame.setVisible(true); final JTextArea Area = new JTextArea(5,0); // スクロールペインにテキストエリアを追加 JScrollPane scrollPane = new JScrollPane(Area); // パネルをコンポーネントに配置 contentPane.add(text, BorderLayout.NORTH); contentPane.add(scrollPane, BorderLayout.CENTER); Frame.setVisible(true); } static class MyActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { } } } どう文字をテキストエリアに表示したらいいのかわからなくて質問させていただきました。 よろしくお願いします。

    • ベストアンサー
    • Java
  • httpsサイトからのhtmlソース取得

    以下のようなコードを書いてみましたところ、httpサイト (1) からはhtmlソースが全行取得できたのですが、httpsサイト (2) からは途中約1/3以降からしか得られませんでした。 ところが、httpsサイトでも (3) を試したところ全部取得できます。何がいけないのか~何を調べればよいのか~が分からず困惑しております。ご教示いただけましたら幸いです。 import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.net.URL; import java.net.HttpURLConnection; import javax.net.ssl.HttpsURLConnection; public class GetHtmlTest { public static void main(String[] args) { try { URL u = new URL("http://stocks.finance.yahoo.co.jp/stocks/detail/?code=2371.T"); // (1) HttpURLConnection con = (HttpURLConnection) u.openConnection(); // (1) InputStreamReader isr = new InputStreamReader(con.getInputStream(), "UTF-8"); // (1) // URL u = new URL("https://www.sbisec.co.jp/ETGate"); // (2) // HttpsURLConnection con = (HttpsURLConnection) u.openConnection(); // (2) // InputStreamReader isr = new InputStreamReader(con.getInputStream(), "SJIS"); // (2) // URL u = new URL("https://www.monex.co.jp/Login/00000000/login/ipan_web/hyoji"); // (3) // HttpsURLConnection con = (HttpsURLConnection) u.openConnection(); // (3) // InputStreamReader isr = new InputStreamReader(con.getInputStream(), "SJIS"); // (3) BufferedReader br = new BufferedReader(isr); String line; StringBuilder sb = new StringBuilder(); while ((line = br.readLine()) != null) { sb.append(line).append(System.getProperty("line.separator")); } System.out.println(sb.toString()); br.close(); isr.close(); } catch (IOException e) { e.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • Javaでタイマーの使い方

    Javaでタイマーの使い方作り方がわかりません import javax.swing.Timerこれつかいます。 package Test1; import javax.swing.Timer; public class Test1 { Timer TM = new Timer(10, null); public static void main(String[] args) { } } よろしくお願いします。

    • ベストアンサー
    • Java
  • Java swing RTFファイル 文字化けする

    Java初心者です。 今、下記のようなプログラムを作成しました。 import java.awt.*; import java.io.*; import javax.swing.*; import javax.swing.text.*; import javax.swing.text.rtf.*; class RTFView extends JFrame { public RTFView() { setTitle( "RTF Text Application" ); setSize(1200, 720); setBackground( Color.gray ); getContentPane().setLayout( new BorderLayout() ); JPanel topPanel = new JPanel(); topPanel.setLayout( new BorderLayout() ); getContentPane().add( topPanel, BorderLayout.CENTER ); // Create an RTF editor window RTFEditorKit rtf = new RTFEditorKit(); JEditorPane editor = new JEditorPane(); editor.setEditorKit( rtf ); editor.setBackground( Color.white ); // This text could be big so add a scroll pane JScrollPane scroller = new JScrollPane(); scroller.getViewport().add( editor ); topPanel.add( scroller, BorderLayout.CENTER ); // Load an RTF file into the editor try { FileInputStream fi = new FileInputStream( "test.rtf" ); rtf.read( fi, editor.getDocument(), 0 ); } catch( FileNotFoundException e ) { //ファイルがない場合 cmd 上に(" ")内が表示される System.out.println( "File not found" ); JEditorPane ep1 = new JEditorPane(); } catch( IOException e ) { System.out.println( "I/O error" ); } catch( BadLocationException e ) { } } public static void main( String args[] ) { // Create an instance of the test application RTFView mainFrame = new RTFView(); mainFrame.setVisible( true ); } } コンパイル後、test.rtfを読み込むものにしましたが、 読込後、日本語が文字化けしてしまっています。 どのように対処すればよいのでしょうか? 検索してもなかなか見つからないので質問させていただきました。 ご回答の程よろしくお願いいたします。

  • ParserDelegator.parse(Unknown Source)

    以下のコードを実行するとこのようなエラーが出てしまいます。エラー を出さずにhtmlをパースしたいのですがどうすればよいでしょうか? (httpが勝手にリンクされてしまうのでhを&x68;にしてあります) 置換してください。 java.lang.NullPointerException at ParserTest$MyCallBack.handleText(ParserTest.java:78) at javax.swing.text.html.parser.DocumentParser.handleText(Unknown Source) at javax.swing.text.html.parser.Parser.handleText(Unknown Source) at javax.swing.text.html.parser.Parser.endTag(Unknown Source) at javax.swing.text.html.parser.Parser.parseTag(Unknown Source) at javax.swing.text.html.parser.Parser.parseContent(Unknown Source) at javax.swing.text.html.parser.Parser.parse(Unknown Source) at javax.swing.text.html.parser.DocumentParser.parse(Unknown Source) at javax.swing.text.html.parser.ParserDelegator.parse(Unknown Source) at ParserTest.<init>(ParserTest.java:51) at ParserTest.main(ParserTest.java:31) 以下ソース: import java.io.*; import javax.swing.text.MutableAttributeSet; import javax.swing.text.&#x68;tml.parser.ParserDelegator; import javax.swing.text.&#x68;tml.HTMLEditorKit; import javax.swing.text.&#x68;tml.HTML; import java.net.Socket; import java.net.URL; import java.net.SocketTimeoutException; import java.io.*; import java.nio.c&#x68;annels.*; import java.util.Has&#x68;table; import java.util.Enumeration; import java.util.regex.*; import java.lang.StringBuffer; import java.lang.Integer; import java.lang.Mat&#x68;; public class ParserTest{ /** * 引数でHTMLファイルを指定 */ public static void main(String[] args) t&#x68;rows IOException, FileNotFoundException{ new ParserTest(new URL("&#x68;ttp://allabout.co.jp/internet/java/closeup/CU20060503A/index3.&#x68;tm"),80); } public ParserTest(URL url,int mPort)t&#x68;rows IOException, FileNotFoundException{ Socket TSock = new Socket(url.getHost(), mPort); TSock.setSoTimeout(3000); BufferedWriter SockOut = new BufferedWriter(new OutputStreamWriter(TSock.getOutputStream())); SockOut.write("GET " + url.getPat&#x68;() + " HTTP/1.1\r\n"); SockOut.write("Host: " + url.getHost() + "\r\n"); SockOut.write("Connection: close\r\n\r\n"); SockOut.flus&#x68;(); InputStream IS = TSock.getInputStream(); InputStreamReader ScISR = new InputStreamReader( IS ); ParserDelegator parser = new ParserDelegator(); MyCallBack mycallback = new MyCallBack(); parser.parse(ScISR, mycallback, true); Enumeration e = mycallback.&#x68;refs.keys(); w&#x68;ile (e.&#x68;asMoreElements()){ String buff =new String((String)e.nextElement()); String Temp; if(mycallback.&#x68;refs.get(buff ).equals("小沢氏、民主公約修正に異議") ){ if(!buff.substring(0,6).equals("&#x68;ttp://")){ Temp = "&#x68;ttp://" + url.getHost() + buff; } System.out.println(buff + mycallback.&#x68;refs.get(buff ) ); } } } private static class MyCallBack extends HTMLEditorKit.ParserCallback{ public Has&#x68;table<String,String> &#x68;refs = new Has&#x68;table<String,String>(); boolean f = false; String &#x68;ref=""; public void &#x68;andleStartTag(HTML.Tag t, MutableAttributeSet a, int pos){ if (t.equals(HTML.Tag.A)){ &#x68;ref = (String)a.getAttribute(HTML.Attribute.HREF); } } public void &#x68;andleText(c&#x68;ar[] data, int pos){ if(&#x68;ref.lengt&#x68;() != 0){ //System.out.println(&#x68;ref); &#x68;refs.put(&#x68;ref, new String(data)); //System.out.println(new String(data)); } } public void &#x68;andleEndTag(HTML.Tag t, int pos){ if (t.equals(HTML.Tag.TD)){ &#x68;ref = ""; } } } }

    • ベストアンサー
    • Java
  • javaについて

    こういうプログラムを組んだんですが、うまく実行できません。 どんな改善をしたらよいでしょうか? import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class Sample { public static void main(String[] args) { String htmlSrc = getHTMLSrc("http://search.yahoo.co.jp/search?p=java", "UTF-8"); htmlSrc = htmlSrc.replaceAll("<.+?>| ", ""); htmlSrc = htmlSrc.replaceAll(".*件-", ""); htmlSrc = htmlSrc.replaceAll("秒.*", "秒"); System.out.println(htmlSrc); } private static String getHTMLSrc(String strURL, String charSet) { StringBuffer sb = new StringBuffer(); HttpURLConnection conn = null; BufferedReader br = null; try { URL url = new URL(strURL); conn = (HttpURLConnection)url.openConnection(); InputStreamReader isr = new InputStreamReader(conn.getInputStream(), charSet); br = new BufferedReader(isr); String tmp = ""; while ((tmp = br.readLine()) != null) { sb.append(tmp); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (br != null) { br.close(); } if (conn != null) { conn.disconnect(); } } catch (IOException e) { e.printStackTrace(); } } return sb.toString(); } } 以下のエラーが表示されるんですが、どうしたらよいでしょうか?? 環境が悪いのでしょうか?? java.net.ConnectException: Operation timed out

    • ベストアンサー
    • Java
  • StyledDocumentの背景色の不具合

    標記の件、JTextPaneにDefaultStyledDocumentを設定して、テキスト編集環境を 構築していますが、デフォルトでのフォントの背景色が正しく取得できません。 フォントのデフォルトの背景色は見た目には白なのですが、 取得される背景色は黒(r=0,g=0,b=0,a=255)になってしまっています。 背景色を適当に設定すると、その部分の色は正しく反映されます。 マニュアルで背景色を黒く設定しているのか、無設定で背景色が黒として取得されて いるのかの判別方法がなく困っております。 以下、サンプルコードを示します。 対処法をご存知の方がおられましたら、よろしくお願いいたします。 import java.awt.Color; import javax.swing.JFrame; import javax.swing.JTextPane; import javax.swing.event.CaretEvent; import javax.swing.event.CaretListener; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.DefaultStyledDocument; import javax.swing.text.MutableAttributeSet; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; import javax.swing.text.StyleContext; import javax.swing.text.StyledDocument; public class StyledDocumentText { public static void main(String[] args) { final StyledDocument document = new DefaultStyledDocument(new StyleContext()); JTextPane textPane = new JTextPane(document); textPane.addCaretListener( new CaretListener(){ public void caretUpdate(CaretEvent e) { // キャレット位置の背景色を取得し、コンソール出力 AttributeSet a = document.getCharacterElement(e.getDot()).getAttributes(); Color background = StyleConstants.getBackground(a); System.out.printf( " %s a=%d\n", background ,background.getAlpha() ); } } ); // テキスト挿入 try { document.insertString(0, "abcdefg", null); } catch (BadLocationException e) { e.printStackTrace(); } // マニュアルで背景色を設定 MutableAttributeSet attr = new SimpleAttributeSet(); StyleConstants.setBackground(attr, new Color(255,100,50,230) ); document.setCharacterAttributes( 2, 3, attr, false); JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add( textPane ); frame.setSize( 300, 300 ); frame.setVisible( true ); } }

  • javaについて>IEのクッキーを使いたい

    IEでログインした状態であれば、ヤフーメールなどクッキーを使うHPにアクセスできるかと思ったのですがアクセスできません。どうすればよいでしょうか? 多分、javaはIEのクッキーを利用していないのですよね・・・ 何とか、IEのクッキーを利用できれば良いのですが。何か、良いお知恵はありませんでしょうか? 宜しくお願い致します。 以下、コードです。 ーーーーーーーーーーーーーーーーーーーーーーー import java.io.*; import java.net.*; class Test { static String input() throws IOException { InputStream is = new FileInputStream("url.txt");//urlを入力 BufferedReader br = new BufferedReader(new InputStreamReader(is)); String str = br.readLine(); return(str); } static void read(String str) throws IOException { OutputStream os = new FileOutputStream("log.txt",true); BufferedWriter fr = new BufferedWriter(new OutputStreamWriter(os)); URL url = new URL(str); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(),"JISAutoDetect")); for (;;) { String i = in.readLine(); if(i == null) { break; } System.out.println(i + "\n"); fr.write(i + "\n"); } in.close(); fr.close(); } public static void main(String[] args) throws IOException { Test brow = new Test(); brow.read(brow.input()); } }

    • ベストアンサー
    • Java
  • ファイルから正しい文字が読み取れない

    こんにちは いつもこちらでお世話になっています。 テキストファイルからすべての文字列を読み込んで フレーム上のtextAreaに読み込んだ文字列を書き込みたいのですが 文字化けしてしまって、正しく表示されません。 どなたか、正しく表示する方法を教えていただけないでしょうか。 よろしくおねがいします。 ちなみに、テキストボックスのパスとファイル名は(c:/test.txt)です。 ================================================= import java.awt.*; import javax.swing.*; import java.io.*; class labeltest { public static void main(String args[]) { JFrame frame=new JFrame("test"); JPanel panel=new JPanel(); JTextArea ta=new JTextArea(20,30); String buff; ta.setLineWrap(true); panel.add(ta); Container ct=frame.getContentPane(); ct.add(panel); try { FileReader fr=new FileReader("c:/test.txt"); BufferedReader br=new BufferedReader(fr); while((buff=br.readLine())!=null) { ta.append(buff); JOptionPane.showMessageDialog(null,buff,"", JOptionPane.PLAIN_MESSAGE); } br.close(); fr.close(); } catch(FileNotFoundException e) { JOptionPane.showMessageDialog(null, "見つからない","失敗",JOptionPane.PLAIN_MESSAGE); } catch(IOException e) { JOptionPane.showMessageDialog(null,"読めない","失敗" ,JOptionPane.PLAIN_MESSAGE); } frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } }

    • ベストアンサー
    • Java
  • JEditorPaneで表示したHTMLを、初期化/変更するには

    プログラム中で生成したHTMLを随時、JEditorPaneに表示しようとしています。また、表示したHTMLをすべて消す(初期化する)こともあります。 以下のようなコードを書いたのですが、うまくいきません。 1.画面が初期化されませんし、初期化した後は追加もされなくなります。 2.追加するとHTMLタグが解釈されずに、そのまま表示されます。 どうすればよいでしょうか? import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; //4openURL import java.awt.Desktop; import java.net.URI; import javax.swing.text.*; import javax.swing.text.html.HTMLDocument; class tstFrame extends JFrame { private final String strHead = "<HTML>" + "<HEAD>" + "<META http-equiv=\"Content-Type\" content=\"text/html\">" + "</HEAD>"; private String strBgColor = "#CCCCCC"; // private String strHTML = "<html><body bgcolor=\"#CCCCFF\">google<br><br><a href=\"http://www.google.co.jp/\">click here!!</a>"; // //ログ表示部 javax.swing.JEditorPane jEdtLogHtml; JButton jbtnA = new JButton ("追加"); JButton jbtnC = new JButton ("変更"); public tstFrame(){ getContentPane().setLayout(new FlowLayout()); //実際にログを表示する窓 jEdtLogHtml = new javax.swing.JEditorPane("text/html" , strHTML); this.getContentPane().add(new JScrollPane(jEdtLogHtml)); jbtnA.addActionListener( new ActionListener(){ public void actionPerformed(ActionEvent e){ java.util.Date d = new java.util.Date(); addText("<font color=\"#FFFFFF\">"+d.toString()+"</font>" ); } }); jbtnC.addActionListener( new ActionListener(){ public void actionPerformed(ActionEvent e){ initALL(); } }); this.getContentPane().add(jbtnA); this.getContentPane().add(jbtnC); this.setSize(400 , 400); this.setVisible(true); // jEdtLogHtml.setEditable(false); } // 画面を初期化する public void initALL(){ //??? jEdtLogHtml = new javax.swing.JEditorPane("text/html" , strHTML); } // 文字列をログに追加する public void addText(String argStrlog){ jEdtLogHtml.setContentType("text/html"); HTMLDocument doc = (HTMLDocument)jEdtLogHtml.getDocument(); SimpleAttributeSet sas = new SimpleAttributeSet(); try{ doc.insertString(doc.getLength(), argStrlog+"\n", sas); }catch(BadLocationException e) { e.printStackTrace(); } jEdtLogHtml.setContentType("text/html"); this.setVisible(true); } public static void main(String[] args) { new tstFrame().setVisible(true); } }

専門家に質問してみよう