【Java】CJK統合漢字の一覧を出力するプログラム


ちょっとある目的のためにCJK統合漢字の一覧がほしくなったので自作した簡単なJavaプログラム。
実行すると「all_cjk_kanji.txt」という名前のUTF-8のテキストファイルを同階層に出力する。



 

import java.io.*;  
import java.util.*;  
import java.text.*;  

public class AllCJKKanjiOutputTest {

private static final File OUTPUT_TEXT_FILE = new File("all_cjk_kanji.txt");  
private static final String ENCODING_UTF8 = "UTF-8";  
  
private static final char START_CHAR = 0x4e00;  
private static final char END_CHAR = 0x9fcf;  
  
private static final int FLUSH_POINT = 100;  
  
private static final DateFormat LOG_FORMAT = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");  
  

public static void main(String[] args) {  
	try {  
		execMain();  
	} catch(Throwable e){  
		e.printStackTrace();  
	}  
}  
  
private static void execMain()  throws Throwable {  
	BufferedWriter bw = null;  
	try {  
		printLog("START");  
		  
		bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(OUTPUT_TEXT_FILE),ENCODING_UTF8));  
		  
		char wkChar = START_CHAR;  
		StringBuilder sb = new StringBuilder();  
		int wkRound = 0;  
		while (wkChar <= END_CHAR) {  
			sb.append(new String(new char[] {wkChar}));  
			wkRound++;  
			wkChar++;  
			  
			if (wkRound % FLUSH_POINT == 0) {  
				StringBuilder hani = new StringBuilder();  
				  
				String haniStart = Integer.toHexString(wkChar - FLUSH_POINT);  
				String haniEnd = Integer.toHexString(wkChar - 1);  
				  
				hani.append(haniStart);  
				hani.append(" - ");  
				hani.append(haniEnd);  
				hani.append(" ");  
				  
				bw.write(hani.toString());  
				  
				bw.write(sb.toString());  
				bw.newLine();  
				bw.flush();  
				  
				sb = new StringBuilder();  
				  
				printLog("	Round [" + wkRound + "] write...");  
			}  

// if (wkRound > 1000) {
// break;
// }

		}  
		bw.write(sb.toString());  
		bw.newLine();  
		bw.flush();  
		  
	} catch(Throwable e) {  
		throw e;  
	} finally {  
		if (bw != null) {  
			bw.close();  
		}  
	}  
  
	printLog("END");  
  
}  
  
private static void printLog(Object msg) {  
	StringBuilder sb = new StringBuilder();  
	sb.append(LOG_FORMAT.format(new Date()));  
	sb.append(" ");  
	if (msg != null){  
		sb.append(msg.toString());  
	}  
	  
	System.out.println(sb.toString());  
}  

}


1行に漢字100文字を出力して次の行に行く。
行頭にその行に出力されている文字コードの範囲をUnicodeで記載。
例えば「4e00 - 4e63」ならU+4E00~U+4E63の文字がその行にずらーっと並んでいる。
ちなみにサロゲートペアは入ってない。
全部で20,943字。

作成されるファイルは改行コード含んでもせいぜい61KB程度とそこまで重くない。
開くと結構圧巻である。
終盤にいくほど構造が複雑になってきており、一見するとつぶれて見えない文字もチラホラと。
その辺見るとAA見てるみたいな気分になってきて頭が痛くなる。