[OSASK 5349] Re: 文字のエンコード

  こんばんは、川合です。


I.Tak. さんは 2002/11/11 18:30:59 の「[OSASK 5346] Re: 文字のエ
ンコード」で書きました:

> マルチバイトにするときでも1バイト目に文字情報を入れないということ
>は、2バイトコードは6bitの自由度しかないことになります。こんな狭い
>ところに入る文字集合といったら JIS X 0201 カタカナ ぐらいしかあり
>ません。実質2バイトコードが使えないわけで……うーん、なんかカッコ
>悪くありません?(^^;

  確かにカッコ悪いです。じゃあ、カッコよくする方法を考えますかね
え。前のやつを、SKE-0と呼ぶことにします。それでまとめ直しておき
ます。

<SKE-0>
  0x00〜0x7f : ASCIIを表わす
  0xe1 ??    : 2バイト文字 6bitの自由度
  0xe2 ?? ?? : 3バイト文字 12bitの自由度
  0xe3 ?? ?? ?? : 4バイト文字 18bitの自由度
  0xe4 ?? ?? ?? ?? : 5バイト文字 24bitの自由度
  0xe5 ?? ?? ?? ?? ?? : 6バイト文字 30bitの自由度

---

  SKE-1は次のように考えます。まず、使うバイトコードは0xa0〜0xdf
だけです。このゾーンを2つに分けます。

  0xa0〜0xbf : 通常バイト用、  0xc0〜0xdf : 最終バイト用

  つまり5bitずつならべているわけです。で、最終バイトが来たらそこ
で打ち切りと。

<SKE-1>
  0x00〜0x7f : ASCIIを表わす
  ?? ??      : 2バイト文字 10bitの自由度
  ?? ?? ??   : 3バイト文字 15bitの自由度
  ?? ?? ?? ?? : 4バイト文字 20btの自由度
  ?? ?? ?? ?? ?? : 5バイト文字 25bitの自由度
  ?? ?? ?? ?? ?? ?? : 6バイト文字 30bitの自由度

  まあ、いい感じです。

---

  それともUTF-8が0x80〜0xffをフルにつかうっぽいので、それに甘ん
じてしまうという手もあります。それでSKE-1ライクな手法でいったの
をSKE-2としますか。

  0x80〜0xbf : 通常バイト用、  0xc0〜0xff : 最終バイト用

<SKE-2>
  0x00〜0x7f : ASCIIを表わす
  ?? ??      : 2バイト文字 12bitの自由度
  ?? ?? ??   : 3バイト文字 18bitの自由度
  ?? ?? ?? ?? : 4バイト文字 24bitの自由度
  ?? ?? ?? ?? ?? : 5バイト文字 30bitの自由度
  ?? ?? ?? ?? ?? ?? : 6バイト文字 36bitの自由度

  もっといい感じです。

---

  考えてみると、SKE-1とかSKE-2の方がよりシンプルですね。SKEシリ
ーズはどれも文字化けを最小限度に抑えられます。でも、12bitではわ
ずかに4096文字が入るだけです。これはJIS漢字の1面には足りません。
第一水準もぎりぎり入りません。18bitになれば、かなりゆとりがあり
ますね。

---

  実用になるかどうかはべつにして、ついでにSKE-3というのを書いて
おきます。これはもはやファイルシステムセーフ性を捨てています。

  0x80〜0xff : 通常バイト用、 0x00〜0x7f : 最終バイト用

<SKE-3>
  0x00〜0x7f : ASCIIを表わす
  ?? ??      : 2バイト文字 14bitの自由度
  ?? ?? ??   : 3バイト文字 21bitの自由度
  ?? ?? ?? ?? : 4バイト文字 28bitの自由度
  ?? ?? ?? ?? ?? : 5バイト文字 35bitの自由度

  これは最終バイトにASCIIの範囲が来ます。だからたとえば' 'を詮
索する場合、バイトで0x20を探してみつけてもそれがスペースである
かどうかは断言できません。1バイト前を見て、その範囲が0x80〜0xf
fならそれは2バイト以上の文字の一部なので、スペースではありませ
ん。このルールは、'\n'や'\t'にも該当します。

  ただ、この方法はシフトJISよりもマシなところがあって、それは
任意の位置からスムーズにシンクロできることです。シフトJISでは
0xa1のコードを発見しても、それが第一バイトなのか、第二バイト
なのか、どんどんさかのぼらないと判明しません。最悪の場合、行
の先頭まで戻ります。EUCも同じ問題を抱えています。

  ちなみに、14bitの自由度というのはかなり広いです。JIS漢字の1
面は全部入れられますし、2面も今定義されている範囲くらいなら余
裕で入ります。

  ' 'や'\n'、'\t'などでちょっと厄介になりますが、しかし効率は
ほとんど変わらないと思われます。またASCIIだけで書かれた文章に
対しては完全に互換です。そして僕たちのようにマルチバイト文字
を当然のようにつかう人にとっては効率がいいと言えるかもしれま
せん。ちなみに、今のバージョンのGOやNASKはSKE-3には対応してい
ません。この例はまあ、もしやったらこうなるよ、というだけのこ
とです。


  それでは。

--
    川合 秀実(KAWAI Hidemi)
OSASK計画代表 / システム設計開発担当
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/


ML番号でジャンプ
ML単語検索