- PR -

保存したtextの文字化け?

1
投稿者投稿内容
Anemous
会議室デビュー日: 2007/11/27
投稿数: 4
投稿日時: 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();
 }
}
johnes
ベテラン
会議室デビュー日: 2007/11/21
投稿数: 50
投稿日時: 2007-11-27 18:02
引用:

Anemousさんの書き込み (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
となる予定でしたがなかなかうまくいきません。

まだまだ初心者なので分からないことだらけですが、ご教授していただければ幸いです。


ちなみにどううまくいかないのでしょう?
ソースをちゃんと見ればわかりそうな気がしますが、、、それにしても
y[][]は??BLANK, BLACK 等を定義している箇所は??となるのでその辺のソースの提示もお願いします。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-11-27 18:04
out.writeByte(i);
で文字ではなくバイナリのbyteを書き出しているためです。

宣言されていないyという配列が使われていたり、
コンパイルが通らないソースコードでは検証もやりにくいので
せめてコンパイルできるようなソースを提示しましょうね。

また、この掲示板ではBBコードという機能があるので、
ソースの貼り付けの際にはcodeタグを利用しましょう。
全角空白でインデントされたソースは勘弁願いたい。
Anemous
会議室デビュー日: 2007/11/27
投稿数: 4
投稿日時: 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;
}
}
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2007-11-29 11:23
コード:
 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();
  }
 }



writeByte() が間違いだった経験を生かして、write() のドキュメントも読みましょう。

i j x[i][j] を誰かがテキストに変換する必要があります。コンマも出力する必要がありますね。

DataOutputStream はそもそもバイナリを出力するためのものなので、今回は使う必要はないと思います。PrintWriter が良いのではないでしょうか。

nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 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」としては理解しません。
バイナリエディタでテキストファイルを開いてみるとかするとわかるかな?
Anemous
会議室デビュー日: 2007/11/27
投稿数: 4
投稿日時: 2007-11-29 13:09
>スフレさん
ご指摘があったとおり「PrintWriter」の方に変えてみたところ、自分が理想としていた通りの出力をすることができるようになりました。ご指摘ありがとうございます。

>nagiseさん
勉強不足だったようで申し訳ありません。文字コードについてもこれから理解を深めていくよう心がけていきたいとおもいます。ご指摘ありがとうございます。

今後も質問をすることがあると思うので、その時またご指摘やご教授していただければ幸いに思います。
1

スキルアップ/キャリアアップ(JOB@IT)