Encoding 避免文本编码的转换

Encoding 避免文本编码的转换,encoding,indy,indy10,Encoding,Indy,Indy10,我有TIdMessage和文本或HTML部分,希望保存它-未更改 目前我的代码是这样的: static_cast<TIdText*>(IdMsg->MessageParts->Items[0])->Body->SaveToFile("file.htm"); static_cast(IdMsg->MessageParts->Items[0])->Body->SaveToFile(“file.htm”); 工作正常,但有一个问题。在消息的一部分中,有一个引用的

我有
TIdMessage
和文本或HTML部分,希望保存它-未更改

目前我的代码是这样的:

static_cast<TIdText*>(IdMsg->MessageParts->Items[0])->Body->SaveToFile("file.htm");
static_cast(IdMsg->MessageParts->Items[0])->Body->SaveToFile(“file.htm”);
工作正常,但有一个问题。在消息的一部分中,有一个引用的可打印编码,看起来像:
=C4=87
-这是
ć
字母的UTF-8代码。但是,Indy将其转换为
E6
,这是同一个字母,但采用中欧编码(可能是它从Windows设置中选择该字母作为目标)。因此,转换是可以的,但我更愿意以未修改的形式保存TIdText附件-保留原始编码

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

有没有办法:

a) 保留原始编码-保存为“原始”数据,仅将编码转换为字节(例如,
=C4=87
保存为二进制数据
C487


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

TIdMessage
解析电子邮件时,默认情况下,它将传输编码(带引号的可打印等)解码为原始字节,然后字符集将这些字节解码为内存中的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);
static\u cast(IdMsg->MessageParts->Items[0])->Body->SaveToFile(“file.htm”,Sysutils::TEncoding::UTF8);