Delphi7 Base64编码UTF8 XML

时间:2018-06-16 20:42:54

标签: delphi utf-8 base64 delphi-7 encode

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

我使用IXMLDocument创建XML,它支持UTF8(即,如果我保存到文件中)。

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

Try1:

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

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

Try2:

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

以上两个都给出了EncodedXML =''(空字符串)。

我做错了什么?

1 个答案:

答案 0 :(得分:3)

请尝试使用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(或者,在两个编码相同的情况下,{{1} }可以按原样进行base64编码):

AnsiString

使用XMLText := XML.XML.Text; EncodedXML := TIdEncoderMIME.EncodeString(XMLText, IndyTextEncoding_UTF8, IndyTextEncoding_UTF8); 时会导致数据丢失,因为您使用EncodeBytes()而未指定任何编码参数。 ToBytes()具有类似的ToBytes()AByteEncoding参数。

如果您尝试对ASrcEncoding进行编码,则只需忘记在调用TMemoryStream后将流Position重置为0,因此SaveToStream()没有任何内容编码。这就是为什么它返回一个空白的base64字符串:

EncodeStream()