UTF-7
概要
UTF-7はUNICODEを演算を行い7ビットに変換したものです。タブ、改行コード、スペース、数字、アルファベット、「'(),-./:?」を除いてBASE64であらわされます。
実装
SHIFT_JISへ変換
UTF-7を下記の方法でUNICODEに変換します。UNICODEからSHIFT_JISへの変換はWindowsのAPIを用いて行います。
- BASE64でないときには、その1文字の上位バイトを0として2バイトに拡張します。
- BASE64でないとき「+」があらわれたときにはBASE64へ移行します。
- 「+-」は「+」1文字になります。
- BASE64で「-」があらわれたときにはBASE64を解除します。余分なビット列は破棄されます。
- BASE64には存在しない文字があらわれたときにはBASE64を解除します。余分なビット列は破棄され、その1文字の上位バイトを0として2バイトに拡張します。
- BASE64では1文字で6ビットをあらわし、AからZを0から25、aからzを26から51、0から9を52から62、+を62、/を63とします。上位ビットから順にUNICODEになります。
BASE64は例えば「IWM」はI=8、W=22、M=12となり、それぞれを6ビットの2進数で表記すると、I=001000、W=010110、M=001100となります。それらを4ビットごとに合わせると0010 0001 0110 0011 00となります。余った2ビットは破棄され、UNICODEは2進数で0010000101100011、16進数で2163hとなります。UNICODEの1文字がBASE64の3文字に相当するのではなく、文字が続く場合には前の余ったビットの部分から使います。UNICODEで3文字がBASE64では8文字になります。
SHIFT_JISから変換
SHIFT_JISからUNICODEへのWindowsのAPIを用いて行います。UNICODEを下記の方法でUTF-7に変換します。
- タブ、改行コード、スペース、数字、アルファベット、「'(),-./:?」は下位1バイトをそのまま1文字にします。
- 「+」は「+-」の2文字になります。
- 上記以外の文字はBASE64であらわします。「+」でBASE64へ移行します。
- BASE64になっているときに、そのまま1文字にできる文字があらわれたときにはBASE64を解除します。余ったビットは下位ビットを0にして6ビットに拡張します。その文字が数字、アルファベット、「+-/」のときにはその文字の前に「-」を置きます。
- BASE64では1文字で6ビットをあらわし、AからZを0から25、aからzを26から51、0から9を52から62、+を62、/を63とします。UNICODEを上位ビットから順に文字に置き換えます。
例えば「岩本一樹」はUNICODEでは5CA9h、672Ch、4E00h、6A39hとなり、これを2進数であらわすと、0101 1100 1010 1001 0110 0111 0010 1100 0100 1110 0000 0000 0110 1010 0011 1001となります。さらにこれを余ったビットに0を加えて6ビットづつに区切ると010111 001010 100101 100111 001011 000100 111000 000000 011010 100011 100100となります。これをBASE64であらわすと「XKlnLE4Aajk」になります。
判別
ファイルを先頭から解析して、下記の条件をすべて満たすときにはUTF-7と判定します。
- BASE64ではないときにはタブ、改行コード、スペース、数字、アルファベット、「!"#$%&'()*,-./:;<=>?@[]^_`{|}」があらわれる。
- 「+」でBASE64となる。BASE64では1文字で6ビットをあらわし、AからZを0から25、aからzを26から51、0から9を52から62、+を62、/を63とする。
- BASE64には存在しない文字があらわれたときにはBASE64を解除する。このとき余ったビットはすべて0になる。
戻る