rm /blog

IT系技術職のおっさんがIT技術とかライブとか日常とか雑多に語るブログです。* 本ブログに書かれている内容は個人の意見・感想であり、特定の組織に属するものではありません。/All opinions are my own.*

【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見てるみたいな気分になってきて頭が痛くなる。