top / index / prev / next / target / source

2004-09-14 diary: Java: Unicode文字コード出力サンプル

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

old-v2

Java: Unicode文字コード出力サンプル

久しぶりに文字コードネタに遭遇したので、これをメモしました。

Unicode文字コード復習

久しぶりに文字コードネタに遭遇したので、検証用のトイプログラムをさくっと作成してメモしておきます。このプログラムは、Unicode文字を範囲指定でファイル出力するものです。 Unicodeコード範囲検証トイプログラム

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

/**
 * Unicodeコード検証クラス
 * @author iga
 */
public class UnicodeCodeGen {
    /** ターゲットとする文字コード */
    private final static String CODE_PAGE = "Unicode";

    /**
     * Unicocd値をもってどの文字コードに割り当てられているかをファイルに出力します。
     * なお、ファイルにはUnicodeのコードで書き出される点に注意ください。
     * @throws IOException
     */
    public static void generateCodeMap() throws IOException {
        BufferedOutputStream outStream = null;
        try {
            outStream =
                new BufferedOutputStream(
                    new FileOutputStream("UnicodeChar.txt"));

            writeLine("★★★文字コード範囲検証プログラム★★★", outStream);
            newLine(outStream);
            newLine(outStream);

            writeLine("【半角英字】 0x41から0x5A および 0x61から0x7A", outStream);
            newLine(outStream);
            writeUnicodeChar(0x41, 0x5A, outStream);
            writeUnicodeChar(0x61, 0x7A, outStream);
            newLine(outStream);
            newLine(outStream);

            writeLine("【半角数字】 0x30から0x39", outStream);
            newLine(outStream);
            writeUnicodeChar(0x30, 0x39, outStream);
            newLine(outStream);
            writeLine(" ※当然だがハイフンおよびピリオドを含んでいない点に注意", outStream);
            newLine(outStream);
            newLine(outStream);

            writeLine("【半角カナ】 Unicodeで 0xFF66 から 0xFF9F", outStream);
            newLine(outStream);
            writeUnicodeChar(0xFF66, 0xFF9F, outStream);
            newLine(outStream);
            writeLine(" ※半角カナの小さい字は含む点に注意", outStream);
            newLine(outStream);
            writeLine(" ※半角カナの長音(ハイフンにあらず)は含む点に注意", outStream);
            newLine(outStream);
            writeLine(" ※半角空白を含まない点に注意", outStream);
            newLine(outStream);
            newLine(outStream);

            writeLine("【半角カナおよび半角カナ句読点】 Unicodeで 0xFF61 から 0xFF9F", outStream);
            newLine(outStream);
            writeUnicodeChar(0xFF61, 0xFF9F, outStream);
            newLine(outStream);
            newLine(outStream);

            writeLine(
                "【半角英数字】 0x30から0x39 および 0x41から0x5A および 0x61から0x7A",
                outStream);
            newLine(outStream);
            writeUnicodeChar(0x30, 0x39, outStream);
            writeUnicodeChar(0x41, 0x5A, outStream);
            writeUnicodeChar(0x61, 0x7A, outStream);
            newLine(outStream);
            newLine(outStream);

        } finally {
            if (outStream != null) {
                outStream.flush();
                outStream.close();
            }
        }

    }

    public static void main(String[] args) {
        try {
            generateCodeMap();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    /**
     * 与えられたコード範囲のUnicodeをファイルに出力します。
     * リトルエンディアン(little endian)で格納します
     * [http://www.atmarkit.co.j...717200.html](http://www.atmarkit.co.jp/icd/root/00/49717200.html)
     * 
     * @param min 下限値
     * @param max 上限値
     * @param writer 出力先ライタ
     * @throws IOException
     */
    public static void writeUnicodeChar(
        int min,
        int max,
        BufferedOutputStream outStream)
        throws IOException {
        for (int code = min; code <= max; code++) {
            // リトルエンディアンとするためビットマスク
            byte lower = (byte) (code & 0xFF);
            byte upper = (byte) ((code & 0xFF00) >> 8);
            outStream.write((char) lower);
            outStream.write((char) upper);
            System.out.print((char) code);
        }
    }

    /**
     * 1行を出力します。
     * @param line
     * @param outStream
     * @throws IOException
     */
    public final static void writeLine(
        String line,
        BufferedOutputStream outStream)
        throws IOException {
        System.out.print(line);
        outStream.write(line.getBytes(CODE_PAGE));
    }

    /**
     * 改行を行います。
     * TODO:改行コードの処理が少しうまくいっていません。
     * @param outStream
     * @throws IOException
     */
    public final static void newLine(BufferedOutputStream outStream)
        throws IOException {
        System.out.println();
        outStream.write("\n".getBytes(CODE_PAGE));
    }
}

リトルエンディアンで格納しています。

、、、昔の日記と比べると、カナの範囲指定はどうも不適切っぽいです。これは再度検証する必要がありそうです。

あと、もっとおおざっぱな実装もメモしておきます。 Unicodeのコードを検証するためのトイプログラム (おおざっぱ版)

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

/**
 * Unicodeコード検証クラス
 * @author iga
 */
public class MojiCodeGen {

    public static void main(String[] args) {
        try {
            generateCodeMap();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    /**
     * Unicocd値をもってどの文字コードに割り当てられているかをファイルに出力します。
     * なお、ファイルにはローカルマシンのコードで書き出される点に注意が必要です。
     * @throws IOException
     */
    public static void generateCodeMap() throws IOException {
        BufferedWriter writer = null;
        try {
            writer =
                new BufferedWriter(
                    new OutputStreamWriter(
                        new FileOutputStream("UnicodeCharList.txt")));

            writer.write("★★★文字コード範囲検証プログラム★★★");
            writer.newLine();
            writer.newLine();

            writer.write("【半角英字】 0x41から0x5A および 0x61から0x7A");
            writer.newLine();
            writer.write("  [");
            writeUnicodeChar(0x41, 0x5A, writer);
            writeUnicodeChar(0x61, 0x7A, writer);
            writer.write("]");
            writer.newLine();
            writer.newLine();
            System.out.println();

            writer.write("【半角数字】 0x30から0x39");
            writer.newLine();
            writer.write("  [");
            writeUnicodeChar(0x30, 0x39, writer);
            writer.write("]");
            writer.newLine();
            writer.write(" ※ハイフンおよびピリオドを含んでいない点に注意");
            writer.newLine();
            writer.newLine();
            System.out.println();

            writer.write("【半角カナ】 Unicodeで 0xFF66 から 0xFF9F");
            writer.newLine();
            writer.write("  [");
            writeUnicodeChar(0xFF66, 0xFF9F, writer);
            writer.write("]");
            writer.newLine();
            writer.write(" ※半角カナの小さい字は含む点に注意");
            writer.newLine();
            writer.write(" ※半角カナの長音(ハイフンにあらず)は含む点に注意");
            writer.newLine();
            writer.write(" ※半角空白を含まない点に注意");
            writer.newLine();
            writer.newLine();
            System.out.println();

            writer.write("【半角カナおよび半角カナ句読点】 Unicodeで 0xFF61 から 0xFF9F");
            writer.newLine();
            writer.write("  [");
            writeUnicodeChar(0xFF61, 0xFF9F, writer);
            writer.write("]");
            writer.newLine();
            writer.newLine();
            System.out.println();

            writer.write("【半角英数】 0x30から0x39 および 0x41から0x5A および 0x61から0x7A");
            writer.newLine();
            writer.write("  [");
            writeUnicodeChar(0x30, 0x39, writer);
            writeUnicodeChar(0x41, 0x5A, writer);
            writeUnicodeChar(0x61, 0x7A, writer);
            writer.write("]");
            writer.newLine();
            writer.newLine();
            System.out.println();
        } finally {
            if (writer != null) {
                writer.close();
            }
        }

    }

    /**
     * 与えられたコード範囲のUnicodeをファイルに出力します。
     * @param min 下限値
     * @param max 上限値
     * @param writer 出力先ライタ
     * @throws IOException
     */
    public static void writeUnicodeChar(
        int min,
        int max,
        BufferedWriter writer)
        throws IOException {
        for (int code = min; code <= max; code++) {
            writer.write((char) code);
            System.out.print((char) code);
        }
    }
}

関連する日記


この日記について