UTF-8はUNICODEを演算を行いASCII互換にしたものです。1文字は1バイトから3バイトになります。複数バイトであらわされる文字のすべてのバイトは80h以上になり、2バイト目以降は1バイト目になりうる値になることはありません。
UTF-8を下記の方法でUNICODEに変換します。UNICODEからSHIFT_JISへの変換はWindowsのAPIを用いて行います。なお、ファイルの最後でバイト数が足りないときには、その1バイトを上位バイトを0として2バイトに拡張します。
最初の1バイトを2進数で110xxxxx、次の1バイトを??yyyyyyとするとUNICODEは2進数で00000xxxxxyyyyyyとなります。
最初の1バイトを2進数で1110xxxx、次の1バイトを??yyyyyy、最後の1バイトを??zzzzzzとするとUNICODEは2進数でxxxxyyyyyyzzzzzzとなります。
その1バイトを上位バイトを0として2バイトに拡張します。
SHIFT_JISからUNICODEへのWindowsのAPIを用いて行います。UNICODEを下記の方法でUTF-8に変換します。
下位1バイトをそのまま1文字にします。
UNICODEを2進数で00000xxxxxyyyyyyとすると最初の1バイトは2進数で110xxxxx、次の1バイトは10yyyyyyとなります。
UNICODEを2進数でxxxxyyyyyyzzzzzzとすると最初の1バイトは2進数で1110xxxx、次の1バイトは10yyyyyy、最後の1バイトは10zzzzzzとなります。
ファイルを先頭から解析して、下記の条件をすべて満たすときにはUTF-8と判定します。