我有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编码?
答案 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);