2011年9月3日土曜日

読み込む時に文字コードを指定する

デフォルトのエンコードの設定って?

ファイルを読み込んだり書き込んだりするときに勝手に使ってくれるデフォルトの文字コードが設定されてるんだって。

それを調べる方法は
System.out.println(System.getProperty("file.encoding"));
ってするとコンソールにでてくるぜよ。

うちの開発環境での「MS932」 
ってなんだろ?(無知

MS932(Windous-31J)

そんなときにはうぃきぺでぃあ 
http://ja.wikipedia.org/wiki/Windows-31J

またびるげいつですか。。。

まてよ。 
Windous-31Jってよく目にするわ。 
JSPで文字コードの設定とかするときばしばし見かけますなあ。 
シフトJISの拡張版とな。

開発環境はWinマシンだからデフォルトがMS932なわけね。で、ファイル読み込みとか書き込みのときに文字コード指定してないからこのMS932で読んじゃってるわけかあ。 
なるほど。。

つまりこれをUTF-8にすればいいわけね。 
やっちゃおう。やってみますよ。


読み込む時に文字コードを指定する

うちのはcsvファイルを入力するです。 
txtとかバイナリファイルなら↓のやり方で大丈夫だって。

文字コードを指定しなくていいならFileReader

これまでこんな風に読み込んでました。
BufferedReader inFile = new BufferedReader(new FileReader(filename.csv));

読む時はこんな。例外は省略
while (inFile.ready()) { 
System.out.println(inFile.readLine()); 
} 
inFile.close();

文字コードを指定するならInputStreamReader

今回使うのはこれこれ。
InputStreamReader(Stream,文字コード)

これはバイトストリーム(Stream)を指定しないといかんのでFileInputStreamを作ってファイル名を指定。それを使います。 
 とほほさんのページ>http://www.tohoho-web.com/java/file.htm#FileInputStream

InputStreamReader isr = new InputStreamReader(new FileInputStream(filename.csv),"UTF-8"));
これで文字コードは指定できた。

実際にはこんな風に使ってみた

ああでも1行ずつ読み込んでくれてるってのは生かしたい。上のままだと読むだけ。

じゃあBufferedReaderを残してFileReaderの代わりにInputStreamReaderを使ってみましたよ。どうよ?
BufferedReader inFile = new BufferedReader(new InputStreamReader(new FileInputStream(filename.txt),"UTF-8"));

ラップしまくりでわかんないですね。 
これと同じ意味
FileInputStream fis = new FileInputStream(filename.txt); 
InputStreamReader in = new InputStreamReader(fis,"UTF-8"); 
BufferedReader inFile = new BufferedReader(in);

BufferdReaderでラップしたので1行ずつ読み込んでくれました。 
使い方は最初のときと同じ。変わったのはFileRearderがInputStreamRearderにしただけ。


書き込む時に文字コードを指定する

やはりcsvファイルとして書き込むです。

文字コードを指定しなくていいなら

これまでこんな風に書き込んでました。
PrintWriter outFile = new PrintWriter(new BufferedWriter(new FileWriter(new File(filename.csv).getAbsolutePath())));

書く時はこんな。例外は省略
for (int i = 0 ; i < 10 ; i++) { 
outFile.println("これで,おっけー?," + i + "回目" ); 
} 
outFile.close();

文字コードを指定するならOutputStreamWriter

今回使うのはこれこれ。
OutputStreamWriter(Stream,文字コード)
読み込みの時と似てるね。

やっぱりFileOutputStreamを作ってファイル名を指定。
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(filename.csv),"UTF-8");
これで文字コードは指定できた。

実際にはこんな風に使ってみた

やっぱ1行ずつ書き込むのって生かしたい。

じゃあBufferedWriterを残してFileWriterの代わりにOutputStreamWriterを使ってみましたよ。どうよ?
PrintWriter outFile = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filename.csv),"UTF-8")));

ラップしまくりでわかんないですね。 
使い方は最初のときと同じ。変わったのはFileWriterがOutputStreamWriterにしただけ。

0 件のコメント:

コメントを投稿