android ansi编码格式,android - 为什么文本文件的编码从UTF-8更改为ANSI(以及解决方法)? - 堆栈内存溢出...

下载此文件时,.txt文件的编码已从UTF-8更改为ANSI

使用TIdAttachmentFile ,文件的原始字节按TIdAttachmentFile发送。 Indy不会更改附件的编码。

TIdAttachmentFile根据传递给构造函数的文件名的扩展名默认其ContentType属性值。 在这种情况下,扩展名为.txt因此ContentType应该默认为text/plain 。 text/...媒体类型具有与之关联的charset属性,但是您没有在代码中设置附件的Charset属性。 否则,接收者将使用默认charset解释数据(通常是RFC 822中的us-ascii )。 因此,收件人很可能正在检测缺少charset的text/plain媒体类型,并以ASCII / ANSI格式显示文件数据,因为它不知道数据实际上是UTF-8编码的(因为文件是附件) ,如果将附件保存到新文件中,则收件人应按原样保存原始字节)。

如果您知道要附加的文件是使用UTF-8编码的事实,则应该对其进行明确说明:

if FileExists(PathString) then

begin

Attachment := TIdAttachmentFile.Create(IdMessage.MessageParts, PathString);

Attachment.ContentType := 'text/plain';

Attachment.Charset := 'utf-8';

end;

并在彼此相邻而不是彼此下方的行中显示其内容。

这听起来更像是换行问题而不是编码问题。 例如,如果Android上的原始文件使用LF换行符,但是收件人仅支持CRLF换行符。

如果需要,您可以让Indy将换行符标准化为CRLF 。 您只需将文件数据加载到TIdText而不是TIdAttachmentFile ,然后确保将TIdText.ContentDisposition属性设置为attachment (否则它将默认设置为inline ),并设置TIdText.FileName ,因此仍会处理数据作为收件人的附件:

if FileExists(PathString) then

begin

Attachment := TIdText.Create(IdMessage.MessageParts, nil);

Attachment.Body.LoadFromFile(PathString, TEncoding.UTF8);

Attachment.ContentType := 'text/plain';

Attachment.Charset := 'utf-8';

Attachment.ContentDisposition := 'attachment';

Attachment.FileName := ExtractFileName(PathString);

end;

现在,尽管如此,您在使用Indy组件时通常还会遇到一些其他小的编码问题。 我建议改成这样:

try

IdSMTP := TIdSMTP.Create(nil);

try

SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(IdSMTP);

IdSMTP.IOHandler := SSLHandler;

IdSMTP.UseTLS := utUseExplicitTLS;

IdSMTP.Host := 'smtp.gmail.com';

IdSMTP.Port := 587;

IdSMTP.AuthType := satDefault;

IdSMTP.Username := AppData.MailAddrSender;

IdSMTP.Password := Appdata.MailPassword;

IdMessage := TIdMessage.Create(nil);

try

IdMessage.From.Name := aName;

IdMessage.From.Address := AppData.MailAddrSender;

IdMessage.Subject := 'E-mail subject';

IdEmailAddressItem := IdMessage.Recipients.Add;

IdEmailAddressItem.Address := AppData.MailAddrReceiver;

IdMessage.Body.Add('Mail todays log,');

PathString := System.IOUtils.TPath.Combine(System.IOUtils.TPath.GetDocumentsPath, PathString + 'Log.txt');

if FileExists(PathString) then

begin

// or TIdText...

Attachment := TIdAttachmentFile.Create(IdMessage.MessageParts, PathString);

Attachment.ContentType := 'text/plain';

Attachment.Charset := 'utf-8';

end;

IdSMTP.Connect;

try

IdSMTP.Send(IdMessage);

finally

IdSMTP.Disconnect;

end;

finally

IdMessage.Free;

end;

finally

IdSMTP.Free;

end;

except

on E: Exception do

//exception handling here

end;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值