我还在使用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 =''(空字符串)。
我做错了什么?
答案 0 :(得分:3)
请尝试使用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(或者,在两个编码相同的情况下,{{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()