2017年5月28日日曜日

Shift-JISの使用範囲


 MS ゴシックで表示できるShift-JISの文字(上の画像は隙間を埋めるように移動しているので、正しい配置ではないことに注意)。

 誰か欲しがるかもしれないので、というかみらいのじぶんが使いたくなると思うので、Shift-JISで使用されている範囲を整数配列にしてみた。ジャグ配列だが、1つめが行数、2つ目がXの開始値、3つ目がXの終了値で、XY共に0-255の256個、YがMSBでXがLSB、という感じ。

 目視で確認してるので、間違ってたらごめんね。

 ちゃんと仕様とか調べれば出てくるんだろうなぁ。

 ほんとは文字列のテーブルにして検索できるようにしたかったけど力尽きた。そっちはどこかのサイトのシフトJISコード表でやってくださいorz


 最初の方に日本の元号の記号があるんだけど、明治・大正・昭和は並んでて、平成だけ飛んでるのが面白い。JISコードが最初に作られたのは昭和の時代で、その後に年号が変わってから平成が追加された、っぽい感じ。普通に考えると年号は数十年単位で変わっていくのだから、昭和の次に余裕を付けておいたほうが拡張性があるし、実際文字コードはスカスカなのでそうすることもできたはず。でもそうせずに、次の年号は別の場所に飛んでいる。年号が変わることを考えるとか恐れ多い!みたいな話があったんだろうか。
 ちなみに明治から昭和までの3個は規則増加だが、平成は明治の前にある。なので明治・大正・昭和の記号を文字列の最初につけて文字コードでソートした場合、明治の前に平成が来ることになる。せっかくなら昭和の後ろに追加すればよかったのに。
 さらに蛇足だが、平成の隣(前)は数個の空きがある。なので50-200年くらいは余裕がありそう。ただし明治から昭和がインクリメントなのに対し、平成以降はデクリメントで、ちょっと面倒っぽい。
 さらにさらに蛇足だが、Unicodeでは平成から明治までが連続している。ただし平成の隣に空きはないっぽい。

2017/05/29:修正
 0x7Fを例外で対応していたけど、うまく動かないことがあるらしいのでテーブルで対応。


int[][] UsedArea = new int[][]
{
    new int[] { 0x00, 0x20, 0x7E },

    new int[] { 0x81, 0x40, 0x7E }, new int[] { 0x81, 0x80, 0xAC },
    new int[] { 0x81, 0xB8, 0xBF },
    new int[] { 0x81, 0xC8, 0xCE },
    new int[] { 0x81, 0xDA, 0xE8 },
    new int[] { 0x81, 0xF0, 0xF7 },
    new int[] { 0x81, 0xFC, 0xFC },

    new int[] { 0x82, 0x4F, 0x58 },
    new int[] { 0x82, 0x60, 0x79 },
    new int[] { 0x82, 0x81, 0x9A },
    new int[] { 0x82, 0x9F, 0xF1 },

    new int[] { 0x83, 0x40, 0x7E }, new int[] { 0x83, 0x80, 0x96 },
    new int[] { 0x83, 0x9F, 0xB6 },
    new int[] { 0x83, 0xBF, 0xD6 },

    new int[] { 0x84, 0x40, 0x60 },
    new int[] { 0x84, 0x70, 0x7E }, new int[] { 0x84, 0x80, 0x91 },
    new int[] { 0x84, 0x9F, 0xBE },

    new int[] { 0x87, 0x40, 0x5D },
    new int[] { 0x87, 0x5F, 0x75 },
    new int[] { 0x87, 0x7E, 0x7E }, new int[] { 0x87, 0x80, 0x9C },

    new int[] { 0x88, 0x9F, 0xFC },
    new int[] { 0x89, 0x40, 0x7E }, new int[] { 0x89, 0x80, 0xFC },
    new int[] { 0x8A, 0x40, 0x7E }, new int[] { 0x8A, 0x80, 0xFC },
    new int[] { 0x8B, 0x40, 0x7E }, new int[] { 0x8B, 0x80, 0xFC },
    new int[] { 0x8C, 0x40, 0x7E }, new int[] { 0x8C, 0x80, 0xFC },
    new int[] { 0x8D, 0x40, 0x7E }, new int[] { 0x8D, 0x80, 0xFC },
    new int[] { 0x8E, 0x40, 0x7E }, new int[] { 0x8E, 0x80, 0xFC },
    new int[] { 0x8F, 0x40, 0x7E }, new int[] { 0x8F, 0x80, 0xFC },
    new int[] { 0x90, 0x40, 0x7E }, new int[] { 0x90, 0x80, 0xFC },
    new int[] { 0x91, 0x40, 0x7E }, new int[] { 0x91, 0x80, 0xFC },
    new int[] { 0x92, 0x40, 0x7E }, new int[] { 0x92, 0x80, 0xFC },
    new int[] { 0x93, 0x40, 0x7E }, new int[] { 0x93, 0x80, 0xFC },
    new int[] { 0x94, 0x40, 0x7E }, new int[] { 0x94, 0x80, 0xFC },
    new int[] { 0x95, 0x40, 0x7E }, new int[] { 0x95, 0x80, 0xFC },
    new int[] { 0x96, 0x40, 0x7E }, new int[] { 0x96, 0x80, 0xFC },
    new int[] { 0x97, 0x40, 0x7E }, new int[] { 0x97, 0x80, 0xFC },
    new int[] { 0x98, 0x40, 0x72 }, new int[] { 0x98, 0x9F, 0xFC },
    new int[] { 0x99, 0x40, 0x7E }, new int[] { 0x99, 0x80, 0xFC },
    new int[] { 0x9A, 0x40, 0x7E }, new int[] { 0x9A, 0x80, 0xFC },
    new int[] { 0x9B, 0x40, 0x7E }, new int[] { 0x9B, 0x80, 0xFC },
    new int[] { 0x9C, 0x40, 0x7E }, new int[] { 0x9C, 0x80, 0xFC },
    new int[] { 0x9D, 0x40, 0x7E }, new int[] { 0x9D, 0x80, 0xFC },
    new int[] { 0x9E, 0x40, 0x7E }, new int[] { 0x9E, 0x80, 0xFC },
    new int[] { 0x9F, 0x40, 0x7E }, new int[] { 0x9F, 0x80, 0xFC },

    new int[] { 0xE0, 0x40, 0x7E }, new int[] { 0xE0, 0x80, 0xFC },
    new int[] { 0xE1, 0x40, 0x7E }, new int[] { 0xE1, 0x80, 0xFC },
    new int[] { 0xE2, 0x40, 0x7E }, new int[] { 0xE2, 0x80, 0xFC },
    new int[] { 0xE3, 0x40, 0x7E }, new int[] { 0xE3, 0x80, 0xFC },
    new int[] { 0xE4, 0x40, 0x7E }, new int[] { 0xE4, 0x80, 0xFC },
    new int[] { 0xE5, 0x40, 0x7E }, new int[] { 0xE5, 0x80, 0xFC },
    new int[] { 0xE6, 0x40, 0x7E }, new int[] { 0xE6, 0x80, 0xFC },
    new int[] { 0xE7, 0x40, 0x7E }, new int[] { 0xE7, 0x80, 0xFC },
    new int[] { 0xE8, 0x40, 0x7E }, new int[] { 0xE8, 0x80, 0xFC },
    new int[] { 0xE9, 0x40, 0x7E }, new int[] { 0xE9, 0x80, 0xFC },
    new int[] { 0xEA, 0x40, 0x7E }, new int[] { 0xEA, 0x80, 0xA4 },

    new int[] { 0xED, 0x40, 0x7E }, new int[] { 0xED, 0x80, 0xFC },
    new int[] { 0xEE, 0x40, 0x7E }, new int[] { 0xEE, 0x80, 0xEC },
    new int[] { 0xEE, 0xEF, 0xFC },

    new int[] { 0xFA, 0x40, 0x7E }, new int[] { 0xFA, 0x80, 0xFC },
    new int[] { 0xFB, 0x40, 0x7E }, new int[] { 0xFB, 0x80, 0xFC },
    new int[] { 0xFC, 0x40, 0x4B },
};

0 件のコメント:

コメントを投稿