[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[orca-users:10230] Re: etch ORCA



結縁晃治 先生 武藤 健志 様 皆様  hskitagawaです。

 続けさせていただきます。いよいよSJISです。どうしてこんな複雑になっとるんだ!と言わずに。ポイントは前々回に話してあります。

3. SJIS
 複雑です。JISの領域を半角カナと半角日本語句読点等の記号を回避して2バイトコードの1バイト目に仕立て上げようってんですから。つまり、半角カナ等に使っちゃったので残り少なくなった「1バイト文字で使用されないコードの領域に望みを托す」わけです。
 じゃあ、半角カナ等のためにどこ使ってるの?と言いますと、A0-DFなんです。つまり、80-9FとE0-FFが空きなのです。しかし、JIS領域をこの範囲でカバーできるでしょうか?80-9Fの長さは9F-80+1 = 20、E0-FFの長さはFF-E0+1 = 20、合計40(16進です。念のため。)JISの場合は7E - 21 = 5D ですから足りません。よって、2バイト目は一部「1バイト文字で使用されるコード」を使わざるをえない、と言うことになります。そのやりかたが非常ーーに複雑なんです。まず、JISから始めます。

    2121 ------------------------------------------------------- 217E
     |                                                             |
     |                                                             |
     |                                                             |
     |            JIS全角記号,数字,第1水準,2水準漢字             |
     |                                                             |
     |                                                             |
     |                                                             |
    7E21 ------------------------------------------------------- 7E7E

 1バイト目が偶数の領域を1バイト目が奇数の領域の後ろに移動します。つまり、2221-227Eは217F-21DBに、2421-247Eは237F-23DB等々になります。

    2121 --------------------------- 217E 217F --------------------------- 21DB

    2321 --------------------------- 237E 237F --------------------------- 23DB

     .
     .
    7D21 --------------------------- 7D7E 7D7F --------------------------- 7DDB

 こんなところですか。次に、これを第1バイトが「1バイト文字で使用されないコードの領域」に移動します。実際には2121を8140に移動しますが、その時、間をつめて並べます。こんな感じです。

   8140 --------------------------- 819D 819E --------------------------- 81FB
    |                                                                       |
    |                                                                       |
    |                                                                       |
   AF40 --------------------------- AF9D AF9E --------------------------- AFFB

 2バイト目は40-FBです。「1バイト文字で使用されるコード」がかぶってるのがおわかりでしょうか。ここで初回の話を思い出してください。7Fは「制御コード」でしたよね。つまり、このコードが読み込まれると、システムがデータではなく削除命令だと解釈してしまうことになり、これは困りますわね。それで、2バイト目の7Fは回避しなければなりません。どうしましょ?2バイト目が7F-FBを1つ右へヨイショと移動します。こんな感じです。

   8140 ------------------- 817E  8180 -------- 819E 819F --------------------------- 81FC
    |                         |    |                                                    |
    |                         |    |                                                    |
    |                         |    |                                                    |
   AF40 ------------------- AF7E  AF80 -------- AF9E AF9F --------------------------- AFFC

 1バイト目を見ましょう。A0-AFは半角カナ領域と重なりますね。こりゃヤバイです。上の要領でズラしましょう。A0をE0にゴー!

   8140 ------------------- 817E  8180 -------- 819E 819F --------------------------- 81FC
    |                         |    |                                                    |
    |                         |    |                                                    |
   9F40 ------------------- 9F7E  9F80 -------- 9F9E 9F9F --------------------------- 9FFC

   E040 ------------------- E07E  E080 -------- E09E E09F --------------------------- E0FC
    |                         |    |                                                    |
   EF40 ------------------- EF7E  EF80 -------- EF9E EF9F --------------------------- EFFC

 ところで、散々「切った貼った」を繰り返しましたが一度も「領域どうしを重ね合わせ」たり「他から新しい領域を持ってきたり」していません。すなわち「SJISとJISの領域は1対1に対応する」ことがわかります。4つに分断されていますが「SJISはJISに変換できる」ことがこれでわかります。もっと言えば「JISに変換できるSJISコードはこの領域にあるものだけ」と言えます。さらに、JIS領域はEUCJP領域と合同ですから「SJISはEUCJPとも1対1に対応する」それゆえに「EUCJPに変換できるSJISコードはこの領域にあるものだけ」だとわかります。つまり、「このSJIS領域以外の2バイトコードは全て外字」扱いとなるのはこの理由からです。なぜなら「EUCJPに変換できないから」です。

 最期にSJISの拡張について。上のSJISには使用されていない領域があります。F040-FFFCですね。これを利用して新たに2バイトコードを割当てることができます。最初は「SJIS外字」として使われたようです。後から「SJIS第3水準漢字」領域ができましたが、「先人に敬意を表して」か、SJIS外字の後方、領域の果てに定義されています。もちろん、これらはEUCJPには変換できません。

   F040 ------------------- F07E  F080 -------- F09E F09F --------------------------- F0FC
    |                         |    |                                                    |
    |        SJIS外字         |    |                 SJIS外字                           |
    |                         |    |                                                    |
   F940 ------------------- F97E  F980 -------- F99E F99F --------------------------- F9FC
   FA40 ------------------- FA7E  FA80 -------- FA9E FA9F --------------------------- FAFC
    |                         |    |                                                    |
    |     SJIS第3水準漢字    |    |                SJIS第3水準漢字                    |
    |                         |    |                                                    |
   FC40 ------------------- FC7E  FC80 -------- FC9E FC9F --------------------------- FCFC

 SJISからEUCJPへの変換を考えましょう。上の逆をやればよいわけです。SJIS文字があったとします。
(1)もし1バイト目がE0-EFならば1バイト目から40を引く。これで上下の矩形が合体します。
(2)次に2バイト目が80-FCならば2バイト目から1を引く。これで8140から始まる1つの矩形になりました。
(3)1バイト目が81のものを1行目として、2バイト目が9E-FBならば、1バイト目に(2X行数 ー 1)を加え、2バイト目から5Dを引く。これで正方形に戻ります。
(4)正方形の左上の8140がA1A!になるようにする。具体的には1バイト目に20を、2バイト目に60を加える。

 これで、EUCJISに変換できました。JISに変換するには(4)で1バイト目から60を、2バイト目から1Fを引けばよろしい。
後は、これを、お使いのプログラム言語でコーディングすれば終わりです。