サンプル集  >  Java  >  ファイル読み込みと文字コード
ファイル読み込みと文字コード
2009/03/05

「UTF-8(BOMサイン無し、CR+LF)」(以下:UTF-8)のファイルをバイト単位に読み込んだら、なんだか上手く読み込めなかったのでいろいろ試してみます。

◆環境
OS Windows XP Professional Version 2002 Service Pack 2
J2SE SDK 1.6.0_01

まずは、普通にファイルを全部読み込んで表示するプログラムを作成します。

fileByteRead.java
 1: 
 2: 
 3: 
 4: 
 5: 
 6: 
 7: 
 8: 
 9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
31: 
32: 
33: 
34: 
35: 
36: 
37: 
38: 
39: 
40: 
41: 
42: 
43: 
44: 
45: 
46: 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * ファイルをバイト単位に読み込む
 * @author ymlib.com
 */

public class fileByteRead
{
    public static void main( String args[] )
        throws FileNotFoundException
             , IOException
    {
        File fin = new File( args[0] );
        System.out.println( "file size(byte): " + fin.length() );

        FileInputStream is = new FileInputStream( fin );

        byte[] buf = new byte[( int )fin.length()];
        int ret = is.read( buf );

        // 読み込んだ結果を表示
        dsp( buf );

        is.close();
    }

    private static void dsp( byte[] buf )
    {
        for ( int i = 0; i < buf.length; i++ )
        {
            if ( i % 16 == 15 )
            {
                System.out.println(
                    Integer.toHexString( buf[i] & 0xff ) );
            }
            else
            {
                System.out.print(
                    Integer.toHexString( buf[i] & 0xff ) + " " );
            }
        }
    }
}

続いて UTF-8 で、数字、英字、半角カナなどが混在したデータを作成します。

UTF-8.dat
1: 
12345ABCDEfghijアイウエオかきくけこサイスセソ東西南北

ファイルの容量は 72バイトになりました。 文字数は 34 文字です。

このファイルを先ほど作成したプログラムで読み込んでみます。

◆実行結果
>java -cp . fileByteRead UTF-8.dat
file size(byte): 72
31 32 33 34 35 41 42 43 44 45 66 67 68 69 6a ef
bd b1 ef bd b2 ef bd b3 ef bd b4 ef bd b5 e3 81
8b e3 81 8d e3 81 8f e3 81 91 e3 81 93 e3 82 b5
e3 82 a4 e3 82 b9 e3 82 bb e3 82 bd e6 9d b1 e8
a5 bf e5 8d 97 e5 8c 97

上手く読み込めました。 ファイルのサイズも 72 バイトで正しいです。

同じ内容の SJIS のファイルを作って読み込ませるとどうなるでしょうか。

SJIS.dat
1: 
12345ABCDEfghijアイウエオかきくけこサイスセソ東西南北

ファイルサイズは 48バイトになりました。

◆実行結果
>java -cp . fileByteRead SJIS.dat
file size(byte): 48
31 32 33 34 35 41 42 43 44 45 66 67 68 69 6a b1
b2 b3 b4 b5 82 a9 82 ab 82 ad 82 af 82 b1 83 54
83 43 83 58 83 5a 83 5c 93 8c 90 bc 93 ec 96 6b

数字、半角英字は同じバイト数の模様です。 半角カナから先が UTF-8 だと 3 バイトで保存されているようです。

バイト数も 半角英数 15文字 + ( 半角カナ+全角 19文字 * 3 ) = 72 でぴったりです。

SJIS では、半角カナは 1 バイトで、全角文字が 2 バイトで保存されているようです。

バイト数は、半角英数+半角カナ 20文字 + ( 全角 14文字 * 2 ) = 48 でこちらもぴったりです。

UTF-8 を SJIS に変換

byte 配列を元に String オブジェクトを作成する際に、Charset を指定すると文字コードを変換してくれます。 UTF-8 で読み込み SJIS へ変換して表示するようにプログラムを修正します。

fileByteReadtoSJIS.java
 1: 
 2: 
 3: 
 4: 
 5: 
 6: 
 7: 
 8: 
 9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
31: 
32: 
33: 
34: 
35: 
36: 
37: 
38: 
39: 
40: 
41: 
42: 
43: 
44: 
45: 
46: 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * ファイルをバイト単位に読み込む
 * @author ymlib.com
 */

public class fileByteReadtoSJIS
{
    public static void main( String args[] )
        throws FileNotFoundException
             , IOException
    {
        File fin = new File( args[0] );
        System.out.println( "file size(byte): " + fin.length() );

        FileInputStream is = new FileInputStream( fin );

        byte[] buf = new byte[( int )fin.length()];
        int ret = is.read( buf );

        // 読み込んだ結果を表示
        dsp( new String( buf, "UTF-8" ).getBytes( "SJIS" ) );

        is.close();
    }

    private static void dsp( byte[] buf )
    {
        for ( int i = 0; i < buf.length; i++ )
        {
            if ( i % 16 == 15 )
            {
                System.out.println(
                    Integer.toHexString( buf[i] & 0xff ) );
            }
            else
            {
                System.out.print(
                    Integer.toHexString( buf[i] & 0xff ) + " " );
            }
        }
    }
}

String を文字コード UTF-8 で生成し、byte 配列を作るときに SJIS に変換するように指定しました。

◆実行結果
>java -cp . fileByteReadtoSJIS UTF-8.dat
file size(byte): 72
31 32 33 34 35 41 42 43 44 45 66 67 68 69 6a b1
b2 b3 b4 b5 82 a9 82 ab 82 ad 82 af 82 b1 83 54
83 43 83 58 83 5a 83 5c 93 8c 90 bc 93 ec 96 6b

読み込みファイルサイズは 72 バイトですが、表示されているは SJIS のコードが表示されています。

▲ PageTop  ■ Home


Copyright (C) 2012 ymlib.com