|
2004/09/14 日記: Java: Unicode文字コード出力サンプル[いがぴょんの日記v2,diary,igapyon,Java,サンプル,Unicode] 久しぶりに文字コードネタに遭遇したので、これをメモしました。 |
| ニュース: Ubuntu 9.04 (Jaunty Jackalope) 正式版リリース 04/24 Debian ベースの Linux ディストリビューションのひとつである Ubuntu の最新版がリリースです。 |
| 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.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); } } }
関連する日記