top / index / prev / next / target / source

2007-06-01 diary: Java: ISO/IEC 646 範囲をファイルに出力するサンプル

いがぴょん画像(小) 日記形式でつづる いがぴょんコラム ウェブページです。

old-v2

Java: ISO/IEC 646 範囲をファイルに出力するサンプル

某文字化け記事のために基礎情報を作成中…。

ISO/IEC 646 範囲をファイルに出力するサンプル

ISO/IEC 646 範囲をファイルに出力するサンプルを書きました。

まずはユーティリティを作成しました。内容がら、この手のダンプユーティリティが必要になります。 HexStringUtil.java

/**
 * 16進表記文字列のためのユーティリティ。
 * 
 * byte を 文字列化するための各種ユーティリティが含まれます。
 * 
 * @version 2007.06.01
 * @author 伊賀敏樹
 */
public final class HexStringUtil {
    /**
     * 与えられたバイト配列を16進表記の文字列に変換します。
     * 
     * 2バイト目以降には、前のバイトとの区切りのために半角空白を付与します。
     * 
     * 変換例。入力:[愛植岡]のShift_JIS化バイト配列 → 出力:[88 a4 90 41 89 aa]
     * 
     * @param argBytes
     *            バイト配列。
     * @return 16進表記の文字列。
     */
    public static String bytesToHexString(final byte[] argBytes) {
        final StringBuffer buffer = new StringBuffer();
        for (int byteIndex = 0; byteIndex < argBytes.length; byteIndex++) {
            if (byteIndex != 0) {
                // 2バイト目以降には半角空白を区切り文字として付与。
                buffer.append(' ');
            }

            buffer.append(byteToHexString(argBytes[byteIndex]));
        }
        return buffer.toString();
    }

    /**
     * 与えられたバイトを16進表記の文字列に変換します。
     * 
     * 必ず2文字が戻ります。
     * 
     * @param argByte
     *            バイト値。
     * @return 16進表記の文字列。
     */
    public static String byteToHexString(final byte argByte) {
        int wrkValue = argByte;
        if (wrkValue < 0) {
            // 負の値の場合には正の値に変換します。
            wrkValue += 0x100;
        }

        String result = Integer.toHexString(wrkValue);
        if (result.length() < 2) {
            // 1文字の場合には 0 の文字を加えて 2文字になるようにします。
            result = "0" + result;
        }
        return result;
    }
}

こちらが本体。 ListIso646.java

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
 * ISO/IEC 646 範囲をファイルに出力するサンプル。
 * 
 * @version 2007.06.02
 * @author 伊賀敏樹
 */
public class ListIso646 {
    public static void main(final String[] args) {
        try {
            new ListIso646().process();
        } catch (IOException ex) {
            System.out.println("入出力例外[" + ex.toString() + "]が発生しました。");
            ex.printStackTrace();
        }
    }

    public void process() throws IOException {
        OutputStream outStream = null;
        try {
            outStream = new BufferedOutputStream(new FileOutputStream(
                    "ListIso646.txt"));

            outStream.write("●ISO/IEC 646 範囲。0x20から0x7eまで。".getBytes());

            // Windowsと仮定して改行コードを出力。
            outStream.write(0x0d);
            outStream.write(0x0a);

            for (int codeLoop = 0x20; codeLoop <= 0x7e; codeLoop++) {
                // 数値を直接ストリームに出力。
                outStream.write(codeLoop);

                // 文字コードの値を読める形で出力。
                outStream.write((": " + HexStringUtil
                        .byteToHexString((byte) codeLoop))
                        .getBytes("Shift_JIS"));

                // Windowsと仮定して改行コードを出力。
                outStream.write(0x0d);
                outStream.write(0x0a);
            }
        } finally {
            if (outStream != null) {
                outStream.flush();
                outStream.close();
            }
        }
    }
}

実行結果

●ISO/IEC 646 範囲。0x20から0x7eまで。
 : 20
!: 21
": 22
#: 23
$: 24
%: 25&: 26
': 27
(: 28
): 29
*: 2a
+: 2b
,: 2c
-: 2d
.: 2e
/: 2f
0: 30
1: 31
2: 32
3: 33
4: 34
5: 35
6: 36
7: 37
8: 38
9: 39
:: 3a
;: 3b<: 3c
=: 3d>: 3e
?: 3f
@: 40
A: 41
B: 42
C: 43
D: 44
E: 45
F: 46
G: 47
H: 48
I: 49
J: 4a
K: 4b
L: 4c
M: 4d
N: 4e
O: 4f
P: 50
Q: 51
R: 52
S: 53
T: 54
U: 55
V: 56
W: 57
X: 58
Y: 59
Z: 5a
[: 5b
\: 5c
]: 5d
^: 5e
_: 5f
`: 60
a: 61
b: 62
c: 63
d: 64
e: 65
f: 66
g: 67
h: 68
i: 69
j: 6a
k: 6b
l: 6c
m: 6d
n: 6e
o: 6f
p: 70
q: 71
r: 72
s: 73
t: 74
u: 75
v: 76
w: 77
x: 78
y: 79
z: 7a
{: 7b
|: 7c
}: 7d
~: 7e

@IT記事執筆 → 大幅遅れ中…

本を探して、それを読んで、を繰り返し中。文字化け記事、難易度高いです。


この日記について