[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[orca-users:10230] Re: etch ORCA
- To: orca-users@xxxxxxxxxxxxxx
- Subject: [orca-users:10230] Re: etch ORCA
- From: kitagawa <srkb91270@xxxxxxxxxxxxxxxx>
- Date: Thu, 10 Jan 2008 13:14:03 +0900
結縁晃治 先生 武藤 健志 様 皆様 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を引けばよろしい。
後は、これを、お使いのプログラム言語でコーディングすれば終わりです。