PHPでGB2312のMIMEエンコード文字列をデコードする

phpproのアカウント情報忘れたので(取り寄せるのも面倒だった

http://www.phppro.jp/qa/515

日本語で表現すると

「ご覧頂き誠に有難う御座います」

になるもよう(コピペじゃないのでミスってるかも)

で,結果から言うとおそらくではあるけどWindowsアプリケーションもある種偶然エンコードデコードできているとみるべきだと思います.

で,ざっとコードを書いてみる.

$ php -r '
    mb_language("Simplified Chinese");
    mb_internal_encoding("UTF-8");
    var_dump(mb_decode_mimeheader("=?gb2312?B?obiktNNF7ZSkrdVcpMvT0Ot5pKbT+df5pKSk3qS5obk=?="));'
string(40) "「ご??き?に有?う御座います」"

とりあえず一部の文字はUTF-8にできなかったらしい.
ここで考えられること.

で,技術的根拠をまざまざと出すにはスキル不足なのは申し訳ないところだけど,個人的にはやはり「規格外のバイトストリームの混入」だと思います.

とりあえずざっくり引き続き調査をしてみる.

まずMIMEエンコードBASE64文字列だけ取り出してみる.

$ php -r 'echo base64_decode("obiktNNF7ZSkrdVcpMvT0Ot5pKbT+df5pKSk3qS5obk=");' | od -tx1 
0000000 a1 b8 a4 b4 d3 45 ed 94 a4 ad d5 5c a4 cb d3 d0
0000020 eb 79 a4 a6 d3 f9 d7 f9 a4 a4 a4 de a4 b9 a1 b9

らしい.これは多分こういう風になると思われる.

「    ご    ?     ?     き    ?     に    有    ?     う    御    座    い    ま    す    」
a1 b8 a4 b4 d3 45 ed 94 a4 ad d5 5c a4 cb d3 d0 eb 79 a4 a6 d3 f9 d7 f9 a4 a4 a4 de a4 b9 a1 b9

で,どう転がっても「覧」をD345Hにできない.

$ for ENCODE
      in UTF-8 UTF-16 UCS-2 UCS-4 EUC-JP Shift_JIS ISO-2022-JP GB2312 EUC-CN;
  do
      echo -e '\n==========\n'$ENCODE':';
      echo -n '覧' | en iconv -f UTF-8 -t ${ENCODE} | od -tx1;
  done

==========
UTF-8:
0000000 e8 a6 a7
0000003

==========
UTF-16:
0000000 ff fe a7 89
0000004

==========
UCS-2:
0000000 a7 89
0000002

==========
UCS-4:
0000000 00 00 89 a7
0000004

==========
EUC-JP:
0000000 cd f7
0000002

==========
Shift_JIS:
0000000 97 97
0000002

==========
ISO-2022-JP:
0000000 1b 24 42 4d 77 1b 28 42
0000010

==========
GB2312:
iconv: illegal input sequence at position 0
0000000

==========
EUC-CN:
iconv: illegal input sequence at position 0
0000000

絶対「iconvがダメということはない」とは言わないけど,日本語をGB2312に突っ込んだときの挙動をちゃんと調査した上でどうにかしないとダメですねこれは.