« Windows XPでWideCharToMultiByte関数を使い、ISO-2022-JPに変換するときの注意点 | メイン | D2 バージョン 2.2.9公開 »

C++Builder 2010のIndyでメール送信について

C++Builder 2010のTIdMessageは、プロパティのCharSetとContentTransferEncodingから、適切に文字コードを変換してエンコードしてくれるようになった。
これによって、C++Builder 2009のときのように、ISO-2022-JPに変換したバイト列をUnicodeStringに代入するという奇妙なコードが不要になった。

しかし、これによって新たに問題が生じている。

一つはWindows 2000におけるWideCharToMultiByte関数の不具合
これによって、Windows 2000ではISO-2022-JPに変換した文字は文字化けする。

もう一つは波ダッシュ問題
WideCharToMultiByte関数による変換では波ダッシュ問題が発生する。

この2つの問題は、Win32APIのWideCharToMultiByte関数が原因なので、Indyの不具合とは言えないと思う。

C++Builder 2009のときには、プログラム側で文字コードを変換しBase64エンコードをしなければならなかった。
一方で、プログラム側でこれらの問題に対応する余地があったとも言える。
C++Builder 2010ではライブラリ側が自動で変換するために、プログラム側では打つ手が見当たらない。

次の問題は、Indyのバグかもしれない。
プロジェクトオプションで、「実行時パッケージを使って構築」のチェックを外すと、 「ERangeError(メッセージ'範囲チェックエラー)」が送出される。

最後に問題が発生するサンプルコードを示す。

std::unique_ptr<TIdMessage> msg(new TIdMessage(NULL));
msg->CharSet = "ISO-2022-JP";
msg->ContentTransferEncoding = "base64";
msg->ContentType = "text/plain; charset=\"ISO-2022-JP\"";
msg->Subject = L"メールの件名"; //=> Windows2000なら件名が消える
msg->Body->Text = L"10~20"; //=> ~が文字化けする
msg->SaveToFile(ChangeFileExt(Application->ExeName, ".eml"), false);

うまい解決策があったら教えて下さい。

トラックバック

このエントリーのトラックバックURL:
http://www.gesource.jp/mt/mt-tb.cgi/1067

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

About

2009年09月17日 23:35に投稿されたエントリーのページです。

ひとつ前の投稿は「Windows XPでWideCharToMultiByte関数を使い、ISO-2022-JPに変換するときの注意点」です。

次の投稿は「D2 バージョン 2.2.9公開」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.35