Linux Freepascal,Indy SVN主干版本,PHP客户端在传输XML时未收到任何内容,直到删除编码转换

Linux Freepascal,Indy SVN主干版本,PHP客户端在传输XML时未收到任何内容,直到删除编码转换,linux,sockets,encoding,indy,fpc,Linux,Sockets,Encoding,Indy,Fpc,我已经编写了一个服务器守护进程(Linux、Ubuntu),它作为前端层与PHP进行通信 最近,我将FPC和Indy库更新为FPC 2.6.0,将Indy更新为trunk版本(在我使用Tiburon分支之前) 所有内容都已编译,看起来都很好,但是,当写入IOHandler时,没有收到任何内容(由PHP客户端接收),客户端将报告收到0个字节 在深入研究这个问题之后,我发现当使用IOHandler中的write方法时,在IdGlobal.pas中的ToBytes()方法中,在发送响应之前,编码是经过

我已经编写了一个服务器守护进程(Linux、Ubuntu),它作为前端层与PHP进行通信

最近,我将FPC和Indy库更新为FPC 2.6.0,将Indy更新为trunk版本(在我使用Tiburon分支之前)

所有内容都已编译,看起来都很好,但是,当写入IOHandler时,没有收到任何内容(由PHP客户端接收),客户端将报告收到0个字节

在深入研究这个问题之后,我发现当使用IOHandler中的write方法时,在IdGlobal.pas中的ToBytes()方法中,在发送响应之前,编码是经过验证和转换的

现在,如果我注释掉ToBytes()例程中的转换行

if ASrcEncoding <> ADestEncoding then begin
  LBytes := TIdTextEncoding.Convert(ASrcEncoding, ADestEncoding, LBytes);
如果是编码,则开始编码
LBytes:=TIdTextEncoding.Convert(ASrcEncoding、ADestEncoding、LBytes);
这一次,PHP客户端接收响应


我的问题是,如何配置Indy tcp服务器或IOHandler来停止对数据进行编码?

Indy调用
TIdTextEncoding.Convert()
,当它认为两种编码不同时,可以将字节从一个字符集转换为另一个字符集。但是,Indy尚未检测到两个
TIdTextEncoding
对象何时表示相同的字符集,因此可以跳过转换。这主要是由于Delphi 2009-XE中Embarcadero的
SysUtils.TEncoding
类存在限制,该类不公开该信息(在Delphi XE2中,
TEncoding
收到了新的
EncodingName
CodePage
属性,但Indy尚未更新以利用它们)。Indy的
TIdTextEncoding
类是Delphi 2009+中
TEncoding
的别名,并以Delphi 5-2007中的
TEncoding
和FreePascal为模型,以便在Indy的整个代码页中维护单个API

Indy目前只是将
TIdTextEncoding
对象指针相互比较,这在使用
TIdTextEncoding
类属性中的标准编码时很好,因为它们在内存中实现为单例对象。但是,如果混入通过
TIdTextEncoding.GetEncoding()
方法获得的
TIdTextEncoding
对象,例如从Indy的
CharsetToEncoding()
函数中,则对象指针将不匹配,即使其字符集不匹配。在理想情况下,这将是从字符集到Unicode再到同一字符集的无操作转换

但是,在FreePascal下,
TIdTextEncoding
使用ICONV库,Indy的ICONV支持不完整。已实现转换,但尚未实现完整的错误处理,主要原因是在不同平台上访问
errno
变量时出现问题,ICONV使用该变量进行扩展错误报告。并非ICONV的所有错误都是致命的,但印地还无法检测到它们

更糟糕的是,
TEncoding
设置为在发生转换错误时不抛出异常,只有在发生缓冲区错误时才会抛出异常(这让Embarcadero感到羞耻)。如果发生数据转换错误,
TEncoding
只返回空数据。在非D2009+环境下,我们必须在
TIdTextEncoding
中保持这种行为,比如FreePascal。我想可以对Indy进行更新,在内部检查这种情况,并在需要时提出自己的异常


为了回答您的问题,您无法告诉Indy跳过对
TIdTextEncoding.Convert()
的调用。您将不得不对其进行注释,并暂时重新编译Indy。这是当前Indy版本中的一个已知问题,已经做了一些工作来解决它,但还没有预计何时可以供公众使用。在Indy 11中,我们可能会放弃对
TEncoding
的支持,在Indy本地实现我们自己的字符集引擎,至少对于常用的字符集是这样。这样,我们就不再依赖于任何特定于平台的API。但我们甚至还没有开始研究Indy 11,甚至还没有决定它的功能集是什么。

Indy调用
TIdTextEncoding.Convert()
,当它认为两种编码不同时,字节可以从一个字符集转换为另一个字符集。但是,Indy尚未检测到两个
TIdTextEncoding
对象何时表示相同的字符集,因此可以跳过转换。这主要是由于Delphi 2009-XE中Embarcadero的
SysUtils.TEncoding
类存在限制,该类不公开该信息(在Delphi XE2中,
TEncoding
收到了新的
EncodingName
CodePage
属性,但Indy尚未更新以利用它们)。Indy的
TIdTextEncoding
类是Delphi 2009+中
TEncoding
的别名,并以Delphi 5-2007中的
TEncoding
和FreePascal为模型,以便在Indy的整个代码页中维护单个API

Indy目前只是将
TIdTextEncoding
对象指针相互比较,这在使用
TIdTextEncoding
类属性中的标准编码时很好,因为它们在内存中实现为单例对象。但是,如果混入通过
TIdTextEncoding.GetEncoding()
方法获得的
TIdTextEncoding
对象,例如从Indy的
CharsetToEncoding()
函数中,则对象指针将不匹配,即使其字符集不匹配。在理想情况下,这将是从字符集到Unicode再到同一字符集的无操作转换

但是,在FreePascal下,
TIdTextEncoding
使用ICONV库,Indy的ICONV支持不完整。已实现转换,但尚未实现完整的错误处理,这主要是由于在不同平台上访问
errno
变量时出现问题,而ICONV