menu_bar

BOCU-1

BOCU-1
Binary Ordered Compression for Unicode

ちょっと、興味があったので 勉強してみました。
元は、 こちら  にありますので、どうぞ そちらを 読んでください。
また、unicode.org の technical note tn6 でも 解説していますので、どうぞ そちらも 参照にしてください。



BOCU1 の圧縮は、Unicode を圧縮する方法として開発されました。

圧縮方法は、基本的に直前の文字コードとの差分を使うことで圧縮します。
差分 のみをデータ列として使う(例えば、伝送する ファイルに保存する)ので、大幅な圧縮が可能です。

それだけだと、圧縮効果が小さいので 以下のような方法を用います。
また、MIMEでも使えるようにするため工夫をしています。

利点:DBで 本方式を圧縮に使ったときに unicode 順に並べることができる。
    MIME でも使えるようにした。

特徴
Bocu-1 解説 (デコード方法)

BOCU-1 で 圧縮された Unicode 一文字をデコードするのに、1〜3バイトのデータが必要です。

一番最初の文字のデコードでは、PC(前の文字)は0x40 にセットされます。なお、リセットがかかった場合も同様です。

まず最初にデータを取得します。
最初の LeadByte の数値を見れば、 Trail Byte がいくつ必要かが わかります。

1.
Lead Byte (L1)
前文字との差が、-64+63 の場合: リードバイトは、(0x50 〜 0xcf) をとる

2.
Lead Byte (L1)
Trail Byte (T1)
前文字との差が、-10513〜-65 or +64 〜 10512 の場合: リードバイト 前文字との差が負の場合 (0x25 〜 0x49) or 正の場合(0xd0 〜 0xfa)

3.
Lead Byte (L1)
Trail Byte (T2)
Trail Byte (T1)
前文字との差が、-187660 〜 -10514 or +10513 〜 +187659 の場合: リードバイト 負の場合(0x21 〜 0x24) or 正の場合(0xfb 〜 0xfe)


という風になります。

もし、最初の 一文字目(Lead Byte)が、0x20 以下なら、そのままのコードが 文字コードとなります。
FFなら、PCが0x40 にセットされて、次に行きます。

1. の場合
Code = PC + (L1- 0x90)

2. の場合

負の場合
Code = PC + (L1- 0x50)*0xf3 - 64 + t1
     
正の場合
Code = PC + (L1-0xd0)*0xf3+64 + t1

3. の場合

負の場合
Code = PC + (L1-0x25)*0xf3*0xf3-0x2911 + t2*0xf3 + t1

正の場合
Code = PC + (L1-0xfb)*0xf3*0xf3+0x2911 + t2*0xf3 + t1


ただし、t1, t2 について、T1, T2 が 0x20 以下であれば、表1に従う。
それ以外であれば、t1 = T1-13, t2 = T2-13 とする。


表1(Trail Byte の数値対応表)
T1
0
0x01
0x02
0x03
0x04
0x05
0x06
0x07
0x08
0x09
対応値
-
0x00
0x01
0x02
0x03
0x04
0x05
-
-
-
T1
0x0a
0x0b
0x0c
0x0d
0x0e
0x0f
0x10
0x11
0x12
0x13
対応値
-
-
-
-
-
-
0x06
0x07
0x08 0x09
T1
0x14
0x15
0x16
0x17
0x18
0x19
0x1a
0x1b
0x1c
0x1d
対応値
0x0a
0x0b
0x0c
0x0d
0x0e
0x0f
-
-
0x10
0x11
T1
0x1e
0x1f
0x20







対応値
0x12
0x13
-







対応値がないところは、エラー扱いです。

感覚的に、1バイトあたり 0xf3(243)進数 という 感じで 思ってもらえると わかりやすいかと 思います。

エンコード方法は、デコード方法を参考に 考えてみてください。
それほど 難しくないと思います。

ホームに戻る


単純リンク・相互リンク 大歓迎です
ご意見、ご感想は、umeda@tele.ucl.ac.beまで
履歴書など TEL +32 10 47 80 74 (オフィス)