Delphi7 Base64编码UTF8 XML

标签 delphi utf-8 base64 delphi-7 encode

我仍在使用 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 及更早版本中,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;

关于Delphi7 Base64编码UTF8 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50891596/

相关文章:

go - 在 golang 中解码 base64 字符串

Delphi (DataSnap) 慢

php - MySQL 到 PostgreSQL 编码问题

node.js - 解码 Base64 pdf 给出损坏的文件

javascript - Base64 图像数据不适用于 fabricjs 中的 loadfromJSON

c - 在 glib 中打印 utf8

delphi - 是否有关于如何在 Delphi 中使用异常的视频/屏幕转换

php - 将在 Delphi 和 PHP 中产生相同结果的字符串哈希函数

delphi - 为什么当我尝试实现接口(interface)时收到 "Invalid pointer operation"?

unicode - 手动将 unicode 代码点转换为 UTF-8 和 UTF-16