从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
相关产品推荐
相关产品推荐

