WinXP VS2005 MFC
下のページを見ながらメーラーを作ってるのですが、
http://www.kumei.ne.jp/c_lang/
POPから取り出した日本語の添付ファイル名が
デコードできずに困っています。
ファイル名は
%E3%82%A6%E3%82%A3%E3%82%AD
のような形式です。
よろしくお願いします。
ん?
ファイル名がそのようになることは無いはずですが……。
まともなメーラーであれば,RFC 2231に沿うので,最初に文字エンコーディングが書かれ
ているはずです。
RFC違反であるMIME Bエンコードであっても,最初に文字エンコーディングが書かれてい
ます。
あとは,エンコードがRFC 2231かMIMEかによって振り分けてやればよいです。
提示のものは,おそらく,
Content-Disposition: attachment;
filename*=utf-8'ja'%E3%82%A6%E3%82%A3%E3%82%AD
のようになっていたはずで,これはファイル名のエンコーディングがUTF-8であることを
示し,それでデコードするとファイル名が「ウィキ」のファイルになります。
# RFC 2231にはerrataが出ています。サンプルに間違いがあるので注意してください。
>YuOさん
返信ありがとうござます。
文字のエンコーディングは確かに乗っていました。
ISO-2022-JPでした。
ところで、
%が入っている文字列はどういう風に
デコードするのでしょうか?
一応調べたのですが、具体的にどのようにされて、
「ウィキ」迄たどり対なのですか?
難しい質問かもしれませんが、
よろしくお願いします。
%の次の2文字を16進数で読み込めば良い。
このバイト列がISO-2022-JP等でエンコードされた文字列なので、これをさらに
Unicodeなどに変換する必要がある。
> 文字のエンコーディングは確かに乗っていました。
> ISO-2022-JPでした。
本当にISO-2022-JPですか?
どうみても,ISO-2022-JPとは思えませんが。
Content-DispositionフィールドにISO-2022-JPだと書かれていて,
あの文字列があるならば,それは単に無効な文字列です。
> %が入っている文字列はどういう風に
> デコードするのでしょうか?
> 一応調べたのですが、具体的にどのようにされて、
> 「ウィキ」迄たどり対なのですか?
単純に%の直後の2文字が16進数だから,そのままデコードするだけです。
文字コードの並びからUTF-8だろうと予想してデコードしました。
一応調べたとありますが,ちゃんとRFCを読みましたか?
せめて回答中に挙げたRFC 2231は読んでください。
本当であれば,MIME,つまりRFC 2045~2049も読まないといけないですが……。
どのレベルまで実装しようとしているかによりますけれど、
本当に実用に使えるレベルのメーラーを作成するつもりなら
YuOさんが言われているようにRFCをきちんと読んで
メールのやり取りやメールそのものに関する知識を集めないと
無理ですよ。
自分の勉強用であって実用レベルを目指さないなら必須とは言いませんけれど、
それでも自分がやりたい事に関係するRFCは読みこなさないとまともに動くものは
難しいと思います。
また、RFCにきちんとあわせて作っていても勝手な事をしているメーラーと言うのは
あるのでそういったメーラーからの物も救おうとするとかなりの手間になります。
世の中でメーラーが売り物になっていると言う事からして実用に耐えるものを作るのが
以下に大変なのかがわかると思います。
チャレンジする姿勢はすばらしいと思いますので、気長に調べながら頑張ってみてはと思
います。
>ふぬやさん
ありがとうございます!
おかげさまで、今回については出来ました。
以下手順
%でSplitする。
各要素を
char c = (char)strtol(split,***,16);
で強制変換
デコード
>YuOさん
例で載せた文字列はあくまで「%で区切られた文字列」
を表現したくて、WikiのURLからコピーしたものです。
勘違いさせてしまい申し訳ありません。
RFCについては、英語で断念し
紹介サイトを読んだだけでした。すいません。
必要なトコだけというのではやはり穴が開くということでしょうか。
ありがとうございました。
>PATIOさん
商品ではないので「完璧」は目指せませんが、
今回のことで、文字コードの違いからくる問題に興味がわきました。
とりあえずRFC準拠、OE、OL、ベッキーぐらいの
有名どころは大丈夫なぐらいまでこつこつ進めて生きたいと思います。
一気は無理ですがまたわからないところがあったら質問させてください。
ありがとうございました。
済み