技術日誌

DB,Java,セキュリティ,機械学習など。興味のあることを雑多に学ぶ

AS400やRPG言語等で利用されているEBCDICコード順ソートをJavaで実現する方法

某所でちょっと話題になったので、ASCIIのスーパーセットになっていない文字コードをソートする方法を紹介します

ASCII - Wikipedia

asciiでは文字は

  • 数字->英語大文字、英語小文字

の順で並んでいますが、最近普通に使われている文字コードも大体はASCIIコードのスーパーセットになっており、 数字と英語は同じ並びになっています。(だから日本語以外は文字化けしなかったりするケースが多いわけですね〜)

asciiが登場するより前に出現した文字コード*1この順番になっていなかったりします。

  • 英語小文字->英語大文字->数字*2

EBCDIC - Wikipedia

ラムダ式の復習なども兼ねて、こちらをJavaでソートするコードを書きました。

import java.util.*;
import java.nio.charset.*;

public class Main {
    public static void main(String[] args) throws Exception {

        //データ用意
        List<String> list = Arrays.asList("abcd","1234","ABCDEFG","Z","z");

        //ソート
        Collections.sort(list,(a,b)->{
            Charset encoding = Charset.forName("IBM1047");
            return encoding.encode(a).compareTo(encoding.encode(b));
        });

        //EBCDICでソートしたものを表示
        System.out.println(list);
        //表示結果[abcd, z, ABCDEFG, Z, 1234]
        
        //デフォルトのソート
        Collections.sort(list);
        System.out.println(list);
        //表示結果[1234, ABCDEFG, Z, abcd, z]

    }
}

Javaでサポートされている文字コードならIBM1047以外もこの方法が使えます*3

サポートされているエンコーディング

*1:EBCDIC,ASCIIどちらも1963年らしいが

*2:IBM1047の場合。オリジナルのEBCDICには英語小文字がない

*3:最近のJavaの状況を解説しているドキュメンが見つかりませんでした