hunamizawa’s blog

無い物は作りたい人のメモ帳

Windows-31J と JIS X 0213:2004 の差分

ARIB STD-B24 8単位符号 を Unicode へデコードするライブラリを書く際に、Windows-31JJIS X 0213:2004 の差分を知る必要が出てきたので、diff した結果をメモ。

コード

プロジェクトX0213(http://x0213.org/)で配布しているファイル『JIS X 0213:2004 漢字8ビット符号とUnicodeの対応表』(ファイル名:jisx0213-2004-8bit-std.txt)が必要。

static void Main(string[] args)
{
    var eucjp = Encoding.GetEncoding(51932);
    var table = MakeJISTable();

    var rows = new string[3];
    var bs = new byte[2];

    for (var ku = 1; ku <= 94; ku++)
    {
        var flag = false;
        rows[0] = $"|{ku}区|";
        rows[1] = "|JIS|";
        rows[2] = "|Win|";

        for (var ten = 1; ten <= 94; ten++)
        {
            var jis = table[ku, ten];
            bs[0] = (byte)(ku + 0xA0);
            bs[1] = (byte)(ten + 0xA0);
            var euc = eucjp.GetString(bs);
            if (jis != euc)
            {
                flag = true;
                rows[0] += $"{ten}|";
                rows[1] += StrEscape(jis) + "|";
                rows[2] += StrEscape(euc) + "|";
            }

        }
        if (flag)
        {
            Console.WriteLine($"## {ku}区");
            Console.WriteLine();
            Console.WriteLine(rows[0]);
            Console.WriteLine("|:---|");
            Console.WriteLine(rows[1]);
            Console.WriteLine(rows[2]);
            Console.WriteLine();
            Console.WriteLine();
        }
    }
}

// jisx0213-2004-8bit-std.txt を読み込んで配列に格納する
static string[,] MakeJISTable()
{
    var r = new Regex("0x([0-9a-f]{2})([0-9a-f]{2})", RegexOptions.IgnoreCase);

    var table = new string[256, 95];
    for (var ku = 1; ku <= 255; ku++)
    {
        for (var ten = 1; ten <= 94; ten++)
        {
            table[ku, ten] = "・";
        }
    }

    foreach (var line in File.ReadLines("jisx0213-2004-8bit-std.txt", Encoding.UTF8))
    {
        if (line[0] == '#') continue;

        var cols = line.Split('\t');

        if (cols[1].Length == 0)
            continue;

        var codepoints = cols[1].Split('+');
        var str = string.Join("", codepoints.Skip(1).Select(cp => char.ConvertFromUtf32(Convert.ToInt32(cp, 16))));

        var m = r.Match(cols[0]);
        var ku = Convert.ToByte(m.Groups[1].Value, 16) - 0x20;
        var ten = (Convert.ToByte(m.Groups[2].Value, 16) & 0b_0111_1111) - 0x20;
        table[ku, ten] = str;
    }

    return table;
}

// Markdown 用のエスケープ
static string StrEscape(string str)
{
    if (str == "|") return "\\|";
    if (str == "\\") return "\\\\";
    return str;
}

結果(1面のみ)

1区

1区 4 5 7 8 9 10 14 16 17 18 29 31 32 33 34 35 42 43 46 47 48 49 60 61 65 67 68 79 80 81 82 83 84 85 86 87
JIS , . : ; ? ! ` ^ _ / \ | ( ) [ ] { } + = < > ¥ $ ¢ £ % # & * @
Win _

2区

2区 15 16 17 18 19 20 21 22 23 24 25 34 35 36 37 38 39 40 41 44 49 50 51 52 53 54 55 56 57 58 59 75 76 77 78 79 80 81 90 91 92 93
JIS ' " - ~ ¬
Win

3区

3区 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
JIS 0 1 2 3 4 5 6 7 8 9 ⦿ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z
Win

4区

4区 84 85 86 87 88 89 90 91
JIS か゚ き゚ く゚ け゚ こ゚
Win

5区

5区 87 88 89 90 91 92 93 94
JIS カ゚ キ゚ ク゚ ケ゚ コ゚ セ゚ ツ゚ ト゚
Win

6区

6区 25 26 27 28 29 30 31 32 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
JIS ς ㇷ゚
Win

7区

7区 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 82 83 84 85 86 87 88 89 90 91 92 93 94
JIS
Win

8区

8区 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
JIS Ǎ ǎ ǐ ḿ Ǹ ǹ Ǒ ǒ ǔ ǖ ǘ ǚ ǜ
Win

9区

9区 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
JIS   ¡ ¤ ¦ © ª « ­ ® ¯ ² ³ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ø ù ú û ü ý þ ÿ Ā Ī Ū Ē Ō ā ī ū ē ō
Win

10区

10区 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
JIS Ą ˘ Ł Ľ Ś Š Ş Ť Ź Ž Ż ą ˛ ł ľ ś ˇ š ş ť ź ˝ ž ż Ŕ Ă Ĺ Ć Č Ę Ě Ď Ń Ň Ő Ř Ů Ű Ţ ŕ ă ĺ ć č ę ě ď đ ń ň ő ř ů ű ţ ˙ Ĉ Ĝ Ĥ Ĵ Ŝ Ŭ ĉ ĝ ĥ ĵ ŝ ŭ ɱ ʋ ɾ ʃ ʒ ɬ ɮ ɹ ʈ ɖ ɳ ɽ ʂ ʐ ɻ ɭ ɟ ɲ ʝ ʎ ɡ ŋ ɰ ʁ ħ ʕ
Win

11区

11区 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
JIS ʔ ɦ ʘ ǂ ɓ ɗ ʄ ɠ Ɠ œ Œ ɨ ʉ ɘ ɵ ə ɜ ɞ ɐ ɯ ʊ ɤ ʌ ɔ ɑ ɒ ʍ ɥ ʢ ʡ ɕ ʑ ɺ ɧ ɚ æ̀ ǽ ɔ̀ ɔ́ ʌ̀ ʌ́ ə̀ ə́ ɚ̀ ɚ́ ͡ ˈ ˌ ː ˑ ̆ ̋ ́ ̄ ̀ ̏ ̌ ̂ ˥ ˦ ˧ ˨ ˩ ˩˥ ˥˩ ̥ ̬ ̹ ̜ ̟ ̠ ̈ ̽ ̩ ̯ ˞ ̤ ̰ ̼ ̴ ̝ ̞ ̘ ̙ ̪ ̺ ̻ ̃ ̚
Win

12区

12区 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 93 94
JIS
Win

13区

13区 31 55 80 81 82 84 85 86 87 90 91 92 93 94
JIS
Win

14区

14区 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
JIS 𠀋 仿
Win

15区

15区 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
JIS 𡈽 𡌛 𡑮 𡢽
Win

47区

47区 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
JIS 𠮟 𡚴 𡸴
Win

84区

84区 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
JIS 憎
Win

85区

85区 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
JIS 𣇄 𣗄
Win

86区

86区 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
JIS 𣜿 𣝣 毿 𣳾 洿 涿
Win

87区

87区 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
JIS 㸿 𤟱
Win

88区

88区 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
JIS 𥒎
Win

89区

89区 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
JIS 𥔎 𥝱 𥧄 𥶡
Win 俿

90区

90区 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
JIS 羿 𦫿
Win 氿 溿

91区

91区 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
JIS 𦹀 𧃴 𧚄
Win 譿

92区

92区 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
JIS 𨉷 𨏍
Win

93区

93区 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
JIS
Win

94区

94区 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
JIS 𪆐
Win

おまけ

各文字符号集合の区点番号表は Gist に投げてあります。

Windows-31J & JIS X 0213:2004(第1面)区点番号表 · GitHub