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 及更早版本中,string
是 AnsiString
,还有一个可选的 ASrcEncoding
,您可以使用它来指定编码AnsiString
(例如,如果它已经是 UTF-8),以便它可以在编码为指定的字节编码之前正确解码为 Unicode(或者,在两种编码相同的情况下, AnsiString
可以按原样进行 base64 编码):
XMLText := XML.XML.Text;
EncodedXML := TIdEncoderMIME.EncodeString(XMLText, IndyTextEncoding_UTF8, IndyTextEncoding_UTF8);
您在使用 EncodeBytes()
时会丢失数据,因为您在使用 ToBytes()
时没有为其指定任何编码参数。 ToBytes()
具有相似的 AByteEncoding
和 ASrcEncoding
参数。
在您尝试编码 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;
我仍在使用 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 及更早版本中,string
是 AnsiString
,还有一个可选的 ASrcEncoding
,您可以使用它来指定编码AnsiString
(例如,如果它已经是 UTF-8),以便它可以在编码为指定的字节编码之前正确解码为 Unicode(或者,在两种编码相同的情况下, AnsiString
可以按原样进行 base64 编码):
XMLText := XML.XML.Text;
EncodedXML := TIdEncoderMIME.EncodeString(XMLText, IndyTextEncoding_UTF8, IndyTextEncoding_UTF8);
您在使用 EncodeBytes()
时会丢失数据,因为您在使用 ToBytes()
时没有为其指定任何编码参数。 ToBytes()
具有相似的 AByteEncoding
和 ASrcEncoding
参数。
在您尝试编码 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;