BOCU-1
Binary Ordered Compression for Unicode
ちょっと、興味があったので 勉強してみました。
元は、
こちら
にありますので、どうぞ そちらを 読んでください。
また、unicode.org の technical note
tn6
でも 解説していますので、どうぞ そちらも 参照にしてください。
BOCU1 の圧縮は、Unicode を圧縮する方法として開発されました。
圧縮方法は、基本的に直前の文字コードとの
差分を使うことで圧縮します。
差分 のみをデータ列として使う(例えば、伝送する ファイルに保存する)ので、大幅な圧縮が可能です。
それだけだと、圧縮効果が小さいので 以下のような方法を用います。
また、MIMEでも使えるようにするため工夫をしています。
利点:DBで 本方式を圧縮に使ったときに unicode 順に並べることができる。
MIME でも使えるようにした。
特徴
- スペースコードは、前文字の参照としない
- これは、一般的にスペース区切りが多いので、これを参照とすると単語の先頭文字の差分が大きくなるから
- 前文字を直接参照するのではなく、
ひらがな(0x3040 〜 0x309f) なら PC=0x3070
CJK (0x4e00 〜 0x9fa5) なら PC=0x7711
Hangle (0xac00 〜 0xd7a3) なら PC=0xc1d1
それ以外では、PC = 前文字コード &~0x7f + 0x40 とする。(PC: Previous Code、前文字)
- これは、2バイト文字は中央値からの差分のほうが、差分が小さくなるためです
Bocu-1 解説 (デコード方法)
BOCU-1 で 圧縮された Unicode 一文字をデコードするのに、1〜3バイトのデータが必要です。
一番最初の文字のデコードでは、PC(前の文字)は0x40 にセットされます。なお、リセットがかかった場合も同様です。
まず最初にデータを取得します。
最初の LeadByte の数値を見れば、 Trail Byte がいくつ必要かが わかります。
1.
前文字との差が、-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)進数 という 感じで 思ってもらえると わかりやすいかと 思います。
エンコード方法は、デコード方法を参考に 考えてみてください。
それほど 難しくないと思います。
ホームに戻る