发现问题

最近在用delphi做一个自娱的跨平台邮件发送程序时,发现在发送主题为中文时,接收方会显示为?????。这个问题出现在安卓平台,同样的代码,windows平台是没问题的。通过查看邮件的源码发现,安卓程序发送的源码就是???,很明显就是没有对中文进行正确的编码。本以为将idmessage的charset设为utf-8就能解决,结果却事与愿违。
clip-27998453.jpg
于是进行调试分析,终于找到了原因。

解决问题

打开idmessage.pas源码,另存到项目根目录,定位到procedure TIdMessage.GenerateHeader;
这个过程。
找到这一行:
InitializeISO(HeaderEncoding, ISOCharSet);
clip-28499062.jpg
在这一行下面添加:

  {$IFDEF ANDROID}
  ISOCharSet:='UTF-8';
  HeaderEncoding:='B';
  {$ENDIF}

这是针对安卓平台的编译指令。原因就是InitializeISO这个过程初始化字符集数据时,采用的是windows平台的API,没有考虑安卓平台,导致编码识别出错,我们给它加上正确的编码指令,就完美解决了问题。