我仍在使用 Delphi7(我知道),并且我需要以 Base64 格式对 UTF8 XML 进行编码。
我使用 IXMLDocument 创建 XML,它支持 UTF8(即,如果我保存到文件)。
由于我使用 Indy10 来 HTTP Post XML 请求,因此我尝试使用 TIdEncoderMIME 对 XML 进行 Base64 编码。但有些 UTF8 字符编码得不好。
尝试1:
XMLText := XML.XML.Text;
EncodedXML := TIdEncoderMIME.EncodeBytes(ToBytes(XMLText));
在上述情况下,当 XML 保存到字符串时,很可能一些 UTF8 信息/字符已经丢失。
尝试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 Base64编码UTF8 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50891596/