You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从Delphi6 Indy9升级到Delphi11 Indy10后出现字符间空格问题

问题原因

Delphi 6的String是ANSI单字节编码,而Delphi 11默认String为UTF-16双字节Unicode编码。你原代码直接将Unicode字符串按双字节写入流,服务器若按ANSI单字节解析,每个字符的高字节(通常为0x00)会被识别为空格,导致字符间出现空白。

解决方案

方法1:转UTF-8编码写入流(推荐,适配绝大多数HTTP接口)

将Unicode字符串转换为UTF-8(单字节可变长度编码)后写入流,符合HTTP接口的通用编码规范:

var 
  XML: String; 
  UTF8XML: UTF8String;
  stream: TStream;
begin
  ...
  UTF8XML := UTF8Encode(XML);
  stream.WriteBuffer(UTF8XML[1], Length(UTF8XML));
  // 后续执行ZLib压缩及Indy POST请求
end;

或者用更现代的TEncoding方式:

var 
  XML: String; 
  Bytes: TBytes;
  stream: TStream;
begin
  ...
  Bytes := TEncoding.UTF8.GetBytes(XML);
  stream.WriteBuffer(Bytes[0], Length(Bytes));
end;

方法2:适配服务器的ANSI编码(仅当服务器固定要求ANSI时使用)

如果服务器明确要求特定ANSI编码(如GB2312),可指定编码转换:

var 
  XML: String; 
  ANSIXML: AnsiString;
  stream: TStream;
begin
  ...
  // 示例:转换为GB2312编码(代码页936)
  ANSIXML := TEncoding.GetEncoding(936).GetString(TEncoding.UTF8.GetBytes(XML));
  stream.WriteBuffer(ANSIXML[1], Length(ANSIXML));
end;

方法3:使用Indy 10内置工具处理字符串转流

Indy 10提供了编码友好的流写入方法,更贴合组件生态:

var 
  XML: String; 
  stream: TStream;
begin
  ...
  stream := TMemoryStream.Create;
  try
    // 写入UTF-8编码的字符串到流
    TIdTextEncoding.UTF8.WriteStringToStream(stream, XML);
    // 后续压缩、发送逻辑
  finally
    stream.Free;
  end;
end;
额外注意事项
  • 压缩后发送时,需给Indy的POST请求设置Content-Encoding头为gzip或deflate,确保服务器能识别压缩数据。
  • 同时设置Content-Type头(如application/xml; charset=utf-8),明确告知服务器数据的格式和编码。

内容的提问来源于stack exchange,提问作者sn_na_v

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 06:44:58