西海岸より

つらつらざつざつと

[Java] SJISコード表の作成

SJISコードの2バイト文字の一覧表を作成したときのJavaコードメモ。
一行の前4バイトが16進表示で、後2バイトが該当文字というのを繰り返し書き出す処理。

  • SJISCodeTableMaker.java
import java.io.*;
import java.util.*;
public class SJISCodeTableMaker {
    
    private static String fileName = "source.txt"; //出力ファイル名
    private static byte[] newLine = {10, 13}; //0A0D (改行コード)
    
    public static void main(String[] args) throws IOException {
        
        File file = new File(fileName);
        if (file.exists()) file.delete();
        file.createNewFile();
        
        FileOutputStream fos = null;
        
        try {
            fos = new FileOutputStream(fileName);
            
            for (int i = 0; i<=0xFFFF; i++) {
                //コード番号 XXXX
                String codeNumber = zeroPadding(Long.toHexString(i), 4);
                
                //フロント側の数値
                byte front = 
                    Long.decode("0x" + codeNumber.substring(0,2)).byteValue();
                
                //テイル側の数値
                byte tail = 
                    Long.decode("0x" + codeNumber.substring(2,4)).byteValue();
                
                //SJISの範囲内のみ出力
                if (!isSJISRange(i, codeNumber))continue;
                
                //書き込み
                //コード4バイト
                fos.write(codeNumber.getBytes());
                
                //2バイト
                fos.write(front);
                fos.write(tail);
                
                //改行
                fos.write(newLine);
            }
        } finally {
            if (fos != null) {
                fos.close();
            }
        }
    }
    
    private static boolean isSJISRange(int codeNumber, String codeString) {
        
        //フロント側の数値
        int front = 
            Integer.decode("0x" + codeString.substring(0,2));
        
        //テイル側の数値
        int tail = 
            Integer.decode("0x" + codeString.substring(2,4));
        
        // SJISの範囲
        //   上位1バイト   0x81〜0x9f、 0xe0〜0xef、0xf0〜0xfc
        //   下位1バイト   0x40〜0x7e、 0x80〜0xfc
        if ( 
            ((front>=0x81 && front<=0x9f) || (front>=0xe0 && front<=0xef) 
                                          || (front>=0xf0 && front<=0xfc))
                &&
            ((tail>=0x40 && tail<=0x7e) || (tail>=0x80 && tail<=0xfc))
           ) {
            return true;
        }
        
        // 機種依存文字の主なエリア
        //   0x8540〜 0x889e
        if (codeNumber >= 0x8540 && codeNumber <= 0x889e) {
            return true;
        }
        return false;
    }
    
    private static String zeroPadding(String val, int length) {
        int zeroLength = length - val.length();
        if (zeroLength <= 0) return val;
        StringBuilder sb = new StringBuilder();
        for (int i=0; i<zeroLength; i++) sb.append("0");
        sb.append(val);
        return sb.toString();
    }
}
  • 出力形式(source.txt)
XXXXYY
 XXXX:YYのバイトコード
   YY:2バイトの文字表現

(例)
8341ア
8342ィ
・
・
・