避免转换TIdText编码

时间:2014-04-25 19:49:00

标签: encoding indy indy10

我有TIdMessage文本或HTML部分,想要保存它 - 不加改变。

目前我的代码是这样的:

static_cast<TIdText*>(IdMsg->MessageParts->Items[0])->Body->SaveToFile("file.htm");

工作正常,但有问题。在邮件的一部分中,有一个引用的可打印编码,如下所示:=C4=87 - 这是ć字母的UTF-8代码。但是,Indy将其转换为E6,这是相同的字母,但采用中欧编码(可能是从Windows设置中选择它作为目标)。所以转换是可以的,但我更喜欢以未经修改的形式保存TIdText附件 - 保留原始编码。

TIdText的编码为UTF-8,HTML也包含UTF-8元标记。

有办法:

a)保持原始编码 - 另存为&#34; raw&#34;仅将编码转换为字节的数据(例如,=C4=87将保存为二进制数据C487)。

b)设置特定编码,例如,如果我想将其保存为UTF-8编码?

1 个答案:

答案 0 :(得分:1)

TIdMessage解析一封电子邮件时,默认情况下它会将传输编码(引用可打印等)解码为原始字节,然后将这些字节进行charset解码为内存中的UTF-16。为避免这种情况,您必须在加载电子邮件之前将TIdMessage::NoDecode设置为true,但之后您将无法再使用TIdMessage::MessageParts。在任何一种情况下,无论如何都不会得到原始字节,因为TIdMessage主要处理String数据。

Body->SaveToFile(...)正在调用标准VCL TStrings::SaveToFile(),它使用操作系统默认编码保存TString数据,除非您在其Encoding参数中明确指定了不同的编码,例如:

static_cast<TIdText*>(IdMsg->MessageParts->Items[0])->Body->SaveToFile("file.htm", Sysutils::TEncoding::UTF8);