ウィリアムのいたずらの開発日記

ウィリアムのいたずらが、コンピューター関係について、思ったことを好き勝手に書いているブログです。

JAVAのコード変換:その2 InputStreamReaderを使わない方法

2006-10-04 15:31:15 | JavaとWeb

 昨日のJAVAのコード変換のつづきです。
 前回は、InputStream,OutputStreamを使ったわけですけど、1.4から、CharsetDecoder、CharsetEncoderなどがはいったので、文字列(byte配列にしたもの)を、コード変換して、文字列(byte配列にしたもの)に直すということができます。入出力関係無しに。

 で、その方法を示します(といっても、サンプルプログラムはファイル入出力しちゃってるんですけど、ファイルを使わなくてもできます)




■概要

(1)SJISなどを、内部的なコード(UTF8)に、以下の手順でします
・CharsetDecoderを取得します。このとき、SJISに設定しておきます
   Charset charset1 = Charset.forName("SJIS");
   CharsetDecoder decoder = charset1.newDecoder();

・byte配列を、ByteBufferに変換します(ByteBuffer.wrap)
   ByteBuffer bb1 = ByteBuffer.wrap(data);

・そうすると、CharsetDecoderのdecodeで、変換できます

(2)内部的なコード(UTF8)をEUCなどに以下の手順でします。
・CharsetEncoderを取得します。このとき、EUC(EUC_JP)に設定しておきます
    Charset charset2 = Charset.forName("EUC_JP");
    CharsetEncoder encoder = charset2.newEncoder();

・CharsetEncoderのencodeで、変換します
    ByteBuffer bb2 = encoder.encode(cb);

・それを、Byte配列にします
    byte[] outdata = bb2.array();

(1)と(2)を同時に行うと、文字がSJIS=>EUCへ変換されたことになります。




■サンプルソース
 SJISのファイルtest.txtを、EUCに変換し、testEUC.txtというファイル名で書き出します。ソースは以下のとおり。コメントの「変換」のところが、上記の”概要”で書いた内容にあたります。

import java.io.*;
import java.nio.*;
import java.nio.charset.*;

public class test {
	/*
	 * 	メイン処理(呼び出し元)
	 */
	public static void main(String[] args) 
	{
		try
		{

			//==============================//
			//	読み込む		     //
			//==============================//
			File f	=	new File("test.txt");
			FileInputStream fi = new FileInputStream(f);

			//	読み込み
			int len = (int)f.length();
			byte[] data = new byte[len];
			fi.read(data);
			fi.close();

			//==============================//
			//	変換		     //
			//==============================//
			
			//	SJIS=>UTF8
			Charset charset1 = Charset.forName("SJIS");
			CharsetDecoder decoder = charset1.newDecoder();
			ByteBuffer bb1	= ByteBuffer.wrap(data);
			CharBuffer cb 	= decoder.decode(bb1);

			//	UTF8=>EUC
			Charset charset2 = Charset.forName("EUC_JP");
			CharsetEncoder encoder = charset2.newEncoder();
			ByteBuffer bb2 	= encoder.encode(cb);
			byte[] outdata	= bb2.array();
		
			//==============================//
			//	書き出し		     //
			//==============================//
			File f2	=	new File("testEUC.txt");
			FileOutputStream fo = new FileOutputStream(f2);

			//	書き出し
			fo.write(outdata);
			fo.close();
			
		}
		catch (Exception e)
		{
      		e.printStackTrace();
    	}

	}

}

(上記 < > ¥ は、本当は半角)
ジャンル:
ウェブログ
この記事についてブログを書く
この記事をはてなブックマークに追加
« BREWで複数画面を(分割して... | トップ | ジャストシステムの提携した... »
最近の画像もっと見る

あわせて読む

関連するみんなの記事