字符集重置

问题描述

我使用以下代码初始化套接

  Socket:=TmyidHTTP.Create(NIL);
  IOHandler:=TIdioHandlerStack.Create(Socket);

  Socket.HandleRedirects:=true;
  Socket.AllowCookies:=FALSE;
  Socket.ProtocolVersion:=pv1_1;
  Socket.HTTPOptions:=Socket.HTTPOptions+[hoKeepOrigProtocol]+[honoprotocolErrorException]+[hoWantProtocolErrorContent];
  Socket.Request.CustomHeaders.FoldLines:=FALSE;
  Socket.Request.CharSet:='utf-8';
  Socket.Request.ContentType:='text/txt';
  Socket.Request.Accept:='*/*';
  // Socket.ReuseSocket:=rsTrue;
  Socket.Request.Connection:='keep-alive';

(TmyidHTTP仅发布受保护的DoRequest

但是当我查看协议时,会看到以下标头:charset=ISO-8859-1

仅当我在帖子前再次指定Socket.Request.CharSet:='utf-8'; 时,它才有效...

有什么想法可以重置CharSet吗?

解决方法

发生这种情况是因为:

  • 您使用的是Indy 10 1 的旧版本。
  • 您要在设置ContentType属性之后设置CharSet属性。。
  • 您没有在charset属性上指定ContentType属性值。

因此,在这种情况下,ContentType属性设置器将使用默认值重置CharSet属性,而不是保留当前值。

1 这是already fixed于2019年7月:

Embarcadero RSP-13703的修补程序。更新各种ContentType属性设置器,以保留现有的CharSet属性值(如果已设置)并且未指定新的charset属性。

您应该使用Indy的GitHub repo中的最新代码更新已安装的Indy副本(或至少对现有副本应用相同的修复程序,然后再对recompile Indy应用)。

否则,您可以简单地将代码更改为:

  • 交换两个属性分配的顺序:
Socket.Request.ContentType:='text/txt';
Socket.Request.CharSet:='utf-8';
  • charset分配上指定一个ContentType属性值,这将相应地更新CharSet属性:
Socket.Request.ContentType:='text/txt;charset=utf-8';