Delphi MLでIndy10のメール送信で文字化けの話があった。
どのバージョンのIndy10だったかは忘れたが、Base64エンコードに問題があったような記憶がある。
覚えている範囲で、Indy10のBas64エンコード処理の問題について解説する。
■問題のあったIndy10のBase64エンコードの方法
Indy10では、次のような手順でBase64エンコード処理を行っていた。
(1)文字列をBase64エンコードする。
(2)規定の長さで改行する。
問題は(2)の改行を入れる処理だ。
このときマルチバイト文字の途中で改行が入る可能性がある。
■文字化けの症状
たとえば「あいうえお」をエンコードして「aaiiuueeoo」になった。
そして改行を入れて「aaiiuue[改行]eoo」となったとする。
このとき改行以降の文字列が文字化けする可能性がある。
■メールソフト別のデコード処理方法
「aaiiuue[改行]eoo」をどのようにデコードするかによって、
文字化けが発生するメールソフトと発生しないメールソフトが存在している。
文字化けが発生しないメールソフトは次の手順でデコードする。
(1)エンコードされた文字列を結合する
aaiiuue[改行]eoo => aaiiuueeoo
(2)結合した文字列をデコードする
aaiiuueeoo => あいうえお
文字化けが発生するメールソフトでは次のような手順でデコードする。
(1)各行をデコードする
aaiiuue[改行]eoo => あいうX[改行]XXX
※Xは文字化け
(2)デコードした文字列を結合する
あいうX[改行]XXX => あいうXXXX
※Xは文字化けした文字を示しています。
■最後に
記憶違いの可能性があるため、ご自身でソースコードをご確認ください。
問題の解決策が分からず悩んでいましたが、
IdMessage_InitializeISO()で、
VHeaderEncoding = L’8′;
とすることで解決出来ました。
ちなみに、IdCoderHeader.pasによると、VHeaderEncodingは’B’、’Q’、’8’の3種類