- - PR -
保存したtextの文字化け?
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-11-27 17:46
JAVAアプリケーションにて配列データをtextに保存した際、保存した内容が自分の思っているような形になかなかならず文字化けのようになってしまいます。
60×60のマスがあり左上を(0,0)として右下を(60,60)、(0,0)から(60,60)までの全てのマスを調べ「BLANKなら0」「BLACKなら1」「それ以外なら2」として2次配列に数値を保管。その後保管した数値のデータをtextに書き込み出力するというものです。 理想では 0,0,0 0,1,0 0,2,0...... 60,60,0 となる予定でしたがなかなかうまくいきません。 まだまだ初心者なので分からないことだらけですが、ご教授していただければ幸いです。 以下が問題の保存部分のソースになります。 public void saveItem(){ try{ DataOutputStream out = new DataOutputStream (new FileOutputStream("test.txt")); int k, i, j, w; k = 60; i = 0; j = 0; int[][] x = new int[1000][1000]; for(i=0;i<k;i++){ for(j=0;j<k;j++){ if(y[i][j] == BLANK){ w = 0; }else if(y[i][j] == BLACK){ w = 1; }else{ w = 2; } x[i][j] = w; } } for(i=0;i<k;i++){ for(j=0;j<k;j++){ out.writeByte(i); out.writeByte(j); out.writeByte(x[i][j]); out.newLine(); } } out.close(); }catch (IOException e){ e.printStackTrace(); } } | ||||
|
投稿日時: 2007-11-27 18:02
ちなみにどううまくいかないのでしょう? ソースをちゃんと見ればわかりそうな気がしますが、、、それにしても y[][]は??BLANK, BLACK 等を定義している箇所は??となるのでその辺のソースの提示もお願いします。 | ||||
|
投稿日時: 2007-11-27 18:04
out.writeByte(i);
で文字ではなくバイナリのbyteを書き出しているためです。 宣言されていないyという配列が使われていたり、 コンパイルが通らないソースコードでは検証もやりにくいので せめてコンパイルできるようなソースを提示しましょうね。 また、この掲示板ではBBコードという機能があるので、 ソースの貼り付けの際にはcodeタグを利用しましょう。 全角空白でインデントされたソースは勘弁願いたい。 | ||||
|
投稿日時: 2007-11-29 08:16
返信が遅れました。こちらから質問しておいて申し訳ありません。
nagiseさんが言う通りまず「out.writeByte」の部分を修正してみましたが、やはり保存データで文字化けのような物がでてしまいました。 nagiseさん、johnesさんが言う通りまず全てのソースを提示しますのでもう一度見ていただけたら幸いです。 ソースは3つに分かれていてそれぞれ「Zahyou.java」「MainPanel.java」「PaletteDialog,java」となっています。 「Zahyou.java」がメインのプログラムとなっており、「Zahyou.java」をコンパイルすれば全てコンパイルされます。機能の「保存」は起動後の大きいウィンドウのメニューにあります。 FileName:Zahyou.java import java.awt.Container; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.filechooser.FileFilter; import java.io.*; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; public class Zahyou extends JFrame{ public MainPanel mainPanel; public PaletteDialog paletteDialog; public JMenuItem saveItem; public JMenuItem exitItem; public static int row, col; public JScrollPane scrollPane; public JFileChooser fileChooser = new JFileChooser("."); public Zahyou(){ setTitle("MainPanel"); setResizable(false); MainPanel panel = new MainPanel(); Container contentPane = getContentPane(); contentPane.add(panel); initGUI(); pack(); } public void initGUI() { paletteDialog = new PaletteDialog(this); paletteDialog.setVisible(true); mainPanel = new MainPanel(paletteDialog); scrollPane = new JScrollPane(mainPanel); Container contentPane = getContentPane(); contentPane.add(scrollPane); JMenu fileMenu = new JMenu("メニュー"); saveItem = new JMenuItem("保存"); exitItem = new JMenuItem("終了"); fileMenu.add(saveItem); fileMenu.add(exitItem); saveItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { saveItem(); } }); exitItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { exitMap(); } }); JMenuBar menuBar = new JMenuBar(); menuBar.add(fileMenu); setJMenuBar(menuBar); } public void saveItem(){ try{ DataOutputStream out = new DataOutputStream(new FileOutputStream("zahyou.txt")); int k, i, j, w; k = MainPanel.MASU; i = 0; j = 0; int[][] x = new int[1000][1000]; for(i=0;i<k;i++){ for(j=0;j<k;j++){ if(MainPanel.board[i][j] == MainPanel.BLANK){ w = 0; }else if(MainPanel.board[i][j] == MainPanel.BLACK){ w = 1; }else{ w = 2; } x[i][j] = w; } } out.writeChar(PaletteDialog.w3); for(i=0;i<k;i++){ for(j=0;j<k;j++){ out.write(i); out.write(j); out.write(x[i][j]); //out.newLine(); } } out.close(); }catch (IOException e){ e.printStackTrace(); } } public void exitMap(){ System.exit(0); } public static void main(String[] args){ Zahyou frame = new Zahyou(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } //---------------------------------- FileName:MainPanel.java import java.awt.*; import java.awt.event.*; import java.applet.*; import javax.swing.*; import java.lang.String; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import javax.swing.JPanel; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; public class MainPanel extends JPanel implements MouseListener,MouseMotionListener{ public static int GS = 10; public static int MASU = 60; public static int WIDTH = GS * MASU; public static int HEIGHT = WIDTH; public static int BLANK = 0; public static int BLACK = 1; public static int RED = 2; public static int BLUE = 3; public static int[][] board = new int[MASU][MASU]; public PaletteDialog paletteDialog; public Image[] mapChipImages; public MainPanel(PaletteDialog paletteDialog) { setPreferredSize(new Dimension(WIDTH, HEIGHT)); addMouseListener(this); addMouseMotionListener(this); this.paletteDialog = paletteDialog; mapChipImages = paletteDialog.getMapChipImages(); } public MainPanel(){ setPreferredSize(new Dimension(WIDTH, HEIGHT)); initBoard(); addMouseListener(this); } public void paintComponent(Graphics g){ super.paintComponent(g); drawBoard(g); drawSeru(g); } public void mouseClicked(MouseEvent e){ int x = e.getX() / GS; int y = e.getY() / GS; putDownSeru(x, y); repaint(); } public void initBoard(){ for(int y = 0; y < MASU; y++){ for(int x = 0; x < MASU; x++){ board[y][x] = BLANK; } } } public void drawBoard(Graphics g){ int GA = PaletteDialog.w1; g.setColor(new Color(255, 255, 255)); g.fillRect(0, 0, WIDTH, HEIGHT); for(int y = 0; y < MASU; y++){ for(int x = 0; x < MASU; x++){ g.setColor(Color.BLACK); g.drawRect(x * GA, y * GA, GA, GA); } } } public void drawSeru(Graphics g){ for(int y = 0; y < MASU; y++) { for(int x = 0; x < MASU; x++){ if(board[y][x] == BLANK){ continue; }else if(board[y][x] == BLACK){ g.setColor(Color.BLACK); }else if(board[y][x] == RED){ g.setColor(Color.RED); }else if(board[y][x] == BLUE){ g.setColor(Color.BLUE); } g.fillRect(x * GS , y * GS , GS , GS); } } } public void putDownSeru(int x, int y){ int c; c = BLANK; if(board[y][x] == BLANK){ c = BLACK; }else if(board[y][x] == BLACK){ c = RED; }else if(board[y][x] == RED){ c = BLUE; } board[y][x] = c; } public void mousePressed(MouseEvent e){ } public void mouseEntered(MouseEvent e){ } public void mouseExited(MouseEvent e){ } public void mouseReleased(MouseEvent e){ } public void mouseDragged(MouseEvent e){ int x = e.getX() / GS; int y = e.getY() / GS; putDownSeru(x, y); repaint(); } public void mouseMoved(MouseEvent e){ } } //--------------------------------------- FileName:PaletteDialog.java import java.io.*; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.ImageIcon; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JPanel; import java.awt.*; import java.awt.event.*; import java.lang.String; import java.awt.event.ActionListener; import javax.swing.*; import javax.swing.event.*; import javax.swing.ButtonGroup; import javax.swing.JRadioButton; import java.awt.event.ActionEvent; import java.util.*; public class PaletteDialog extends JDialog{ public Image[] mapChipImages; Label lb1,lb2,lb3,lb4; public static int w1,w2,w3,w4; public PaletteDialog(JFrame owner){ super(owner, "Palet", false); setSize(200, 300); setResizable(false); setLayout(new FlowLayout()); Choice a = new Choice(); Choice b = new Choice(); a.add("自由"); a.add("直線"); a.add("円"); b.add("黒"); b.add("赤"); b.add("青"); b.add("消しゴム"); lb1 = new Label("セルサイズ"); lb1.setBounds(25,50,25,18); this.add(lb1); TextField c1 = new TextField("10",10); getContentPane().add(c1); w1 = Integer.parseInt(c1.getText()); lb2 = new Label("列×行"); lb2.setBounds(25,50,25,18); this.add(lb2); TextField c2 = new TextField("60",10); getContentPane().add(c2); w2 = Integer.parseInt(c2.getText()); lb3 = new Label(""); lb3.setBounds(25,50,25,18); this.add(lb3); TextField c3 = new TextField("10",10); getContentPane().add(c3); w3 = Integer.parseInt(c3.getText()); lb4 = new Label(""); lb4.setBounds(25,50,25,18); this.add(lb4); TextField c4 = new TextField("10",10); getContentPane().add(c4); w4 = Integer.parseInt(c4.getText()); add(a); add(b); show(); pack(); } public Image[] getMapChipImages(){ return mapChipImages; } } | ||||
|
投稿日時: 2007-11-29 11:23
writeByte() が間違いだった経験を生かして、write() のドキュメントも読みましょう。 i j x[i][j] を誰かがテキストに変換する必要があります。コンマも出力する必要がありますね。 DataOutputStream はそもそもバイナリを出力するためのものなので、今回は使う必要はないと思います。PrintWriter が良いのではないでしょうか。 | ||||
|
投稿日時: 2007-11-29 11:49
繰り返しになりますが、文字ではなくバイナリのbyteを書き出しているためです。
文字コードについての理解を深めましょう。 http://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89 文字がコンピュータ内部でどのように扱われているかを理解する必要があります。 1が格納されたbyteをコンピュータは「文字の1」としては理解しません。 バイナリエディタでテキストファイルを開いてみるとかするとわかるかな? | ||||
|
投稿日時: 2007-11-29 13:09
>スフレさん
ご指摘があったとおり「PrintWriter」の方に変えてみたところ、自分が理想としていた通りの出力をすることができるようになりました。ご指摘ありがとうございます。 >nagiseさん 勉強不足だったようで申し訳ありません。文字コードについてもこれから理解を深めていくよう心がけていきたいとおもいます。ご指摘ありがとうございます。 今後も質問をすることがあると思うので、その時またご指摘やご教授していただければ幸いに思います。 |
1