Delphi7 Base64 编码 UTF8 XML

Delphi7 Base64 encode UTF8 XML

我仍在使用 Delphi7(我知道),我需要将 UTF8 XML 编码为 Base64 格式。

我使用 IXMLDocument 创建 XML,它支持 UTF8(也就是说,如果我保存到文件)。

由于我使用 Indy10 来 HTTP Post XML 请求,我尝试使用 TIdEncoderMIME 对 XML 进行 Base64 编码。但是一些UTF8字符编码不好。

尝试 1:

XMLText := XML.XML.Text;
EncodedXML := TIdEncoderMIME.EncodeBytes(ToBytes(XMLText));

在上述情况下,当 XML 保存为字符串时,很可能一些 UTF8 information/characters 已经丢失。

尝试2:

XMLStream := TMemoryStream.Create;
XML.SaveToStream(XMLStream);
EncodedXML := TIdEncoderMIME.EncodeStream(XMLStream);
//or
EncodedXML := TIdEncoderMIME.EncodeStream(XMLStream, XMLStream.Size);

以上两个都返回 EncodedXML = ''(空字符串)。

我做错了什么?

请尝试使用 TIdEncoderMIME.EncodeString() 方法。它有一个 AByteEncoding 参数,您可以使用它来指定 Indy 应该将字符串字符编码为所需的字节编码,例如 UTF-8,然后 base64 对结果字节进行编码:

XMLText := XML.XML.Text;
EncodedXML := TIdEncoderMIME.EncodeString(XMLText, IndyTextEncoding_UTF8);

另请注意,在 Delphi 2007 及更早版本中,stringAnsiString,还有一个可选的 ASrcEncoding,您可以使用它来指定编码AnsiString(例如,如果它已经是 UTF-8),以便它可以在编码为指定的字节编码之前正确解码为 Unicode(或者,在两种编码相同的情况下, AnsiString 可以按原样进行 base64 编码):

XMLText := XML.XML.Text;
EncodedXML := TIdEncoderMIME.EncodeString(XMLText, IndyTextEncoding_UTF8, IndyTextEncoding_UTF8);

您在使用 EncodeBytes() 时会丢失数据,因为您在使用 ToBytes() 时没有为其指定任何编码参数。 ToBytes() 具有相似的 AByteEncodingASrcEncoding 参数。

在您尝试编码 TMemoryStream 的情况下,您只是忘记在调用 SaveToStream() 后将流的 Position 重置回 0,因此 EncodeStream() 进行编码。这就是它返回空白 base64 字符串的原因:

XMLStream := TMemoryStream.Create;
try
  XML.SaveToStream(XMLStream);
  XMLStream.Position := 0; // <-- add this
  EncodedXML := TIdEncoderMIME.EncodeStream(XMLStream);
finally
  XMLStream.Free;
end;