7

我正在尝试以 utf-8 格式发布一个请求,但是服务器正在以 Ascii 格式获取它。

尝试了post的TstringList格式。

尝试了流格式

尝试强制 TStringStream 具有 UTF8 编码。

尝试将 indy 更新为 xe5 indy

这是一个示例代码:

var
  server:TIdHttp;
  Parameters,response:TStringStream;
begin
  response := TStringStream.Create;
  Parameters := TStringSTream.create(UTF8String('param1=Value1&param2=عربي/عرب&param3=Value3'),TEncoding.UTF8);
  Server.Post(TIdURI.URLEncode('http://www.example.com/page.php'),Parameters,response);
end;

现在阿拉伯编码在网络嗅探器中作为 Ascii 传递。

0060 d8 b9 d8 b1 d8 a8 d9 8a 2f d8 b9 d8 b1 d8 a8 26 ........ /......&

如何强制 Indy Http id 在 Utf-8 中而不是在 Ascii 中传递请求参数?

4

1 回答 1

18

TStringStream在 D2009+ 中使用UnicodeString并且是-awareTEncoding所以不要UTF8String手动创建:

var
  server: TIdHttp;
  Parameters,response: TStringStream;
begin
  response := TStringStream.Create;
  Parameters := TStringStream.Create('param1=Value1&param2=عربي/عرب&param3=Value3', TEncoding.UTF8);
  Server.Post('http://www.example.com/page.php',Parameters,response);
end;

或者,该TStrings版本也默认编码为 UTF-8:

var
  server: TIdHttp;
  Parameters: TStringList;
  Response: TStringStream;
begin
  response := TStringStream.Create;
  Parameters := TStringList.Create;
  Parameters.Add('param1=Value1');
  Parameters.Add('param2=عربي/عرب');
  Parameters.Add('param3=Value3');
  Server.Post('http://www.example.com/page.php',Parameters,response);
end;

无论哪种方式,您都应该在调用之前设置请求字符集,Post()以便服务器知道您正在发送 UTF-8 编码的数据:

Server.Request.ContentType := 'application/x-www-form-urlencoded';
Server.Request.Charset := 'utf-8';
于 2013-11-10T17:25:59.317 回答