使用:Delphi XE2,Windows 8,美国英语为默认语言
我正在用Delphi写一个电子邮件客户端。我使用TIdIMAP4通过IMAP连接到GMail邮箱并获取如下消息列表:
var
MessageList: TIdMessageCollection;
begin
IMAPClnt.SelectMailBox('INBOX');
IMAPClnt.UIDRetrieveAllEnvelopes(IMAPClnt.MessageList);
然后我会检索这样的邮件主题:
var
IdMsg: TIdMessage;
s: String
begin
for c := 0 to FIMAPClnt.MessageList.Count - 1 do
begin
IdMsg := FIMAPClnt.MessageList[c];
s := IdMsg.Subject;
但是,如果邮件主题使用其他语言(例如,希伯来语),则即使在希伯来语设置为默认Windows语言的计算机上,邮件主题也无法正确显示(请参阅附图)。
如何更正代码以确保其正常工作,以正确的Unicode字符检索语言?
截屏:
TIA。
答案 0 :(得分:2)
屏幕截图中的电子邮件标题已按RFC 2047进行编码(“MIME第三部分:非ASCII文本的邮件标头扩展”)。 TIdIMAP4.UIDRetrieveAllEnvelopes()
捕获并存储原始数据,但不会自动解码。您可以使用Decode...()
单元中的各种IdCoderHeaader.pas
函数手动解码标头,例如:
uses
..., IdCoderHeader;
var
IdMsg: TIdMessage;
s: String
begin
...
for c := 0 to FIMAPClnt.MessageList.Count - 1 do
begin
IdMsg := FIMAPClnt.MessageList[c];
IdMsg.Subject := DecodeHeader(IdMsg.Subject);
DecodeAddresses(IdMsg.FromList);
DecodeAddress(IdMsg.Sender);
DecodeAddresses(IdMsg.ReplyTo);
DecodeAddresses(IdMsg.Recipients);
DecodeAddresses(IdMsg.CCList);
DecodeAddresses(IdMsg.BccList);
...
end;
...
end;