top / index / prev / next / target / source
日記形式でつづる いがぴょんコラム ウェブページです。
久しぶりに文字コードネタに遭遇したので、これをメモしました。
久しぶりに文字コードネタに遭遇したので、検証用のトイプログラムをさくっと作成してメモしておきます。このプログラムは、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);
}
}
}
関連する日記