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

使用TIdHTTPServer与TIdHTTP时UTF-8编码乱码问题求助

解决TIdHTTPServer/TIdHTTP本地测试的UTF-8编码乱码问题

这个问题我之前帮同事排查过,核心就是Indy组件默认的字符编码配置没适配UTF-8,咱们分服务器端和客户端逐一调整就能解决:

服务器端(TIdHTTPServer)调整

  • 全局设置默认字符集:在服务器初始化时(比如OnCreate事件),把DefaultCharset设为UTF-8,让所有响应默认走UTF-8编码:
    IdHTTPServer1.DefaultCharset := 'UTF-8';
    
  • 解析请求内容:如果是POST请求,优先确保客户端在请求头里指定了charset=utf-8,Indy会自动按UTF-8解码;如果客户端没指定,手动用UTF-8解析请求流:
    procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
      ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
    var
      RequestContent: string;
    begin
      if ARequestInfo.PostStream <> nil then
      begin
        RequestContent := TEncoding.UTF8.GetString(ARequestInfo.PostStream.Memory, 0, ARequestInfo.PostStream.Size);
        // 这里处理解码后的RequestContent即可
      end;
    end;
    
  • 返回响应时明确编码:设置响应的ContentType时带上charset=utf-8,确保客户端能正确识别:
    AResponseInfo.ContentType := 'text/plain; charset=utf-8';
    AResponseInfo.Content := 'chào các bạn';
    // 用流方式传递更可靠,避免编码转换丢失:
    // var ResponseStream := TStringStream.Create('chào các bạn', TEncoding.UTF8);
    // AResponseInfo.ContentStream := ResponseStream;
    

客户端(TIdHTTP)调整

  • 发送请求时指定编码:发送POST数据时,用UTF-8编码的流传递,同时在请求头里声明编码类型:
    var
      PostData: TStringStream;
      Response: string;
    begin
      PostData := TStringStream.Create('đi chơi thôi', TEncoding.UTF8);
      try
        IdHTTP1.Request.ContentType := 'application/x-www-form-urlencoded; charset=utf-8';
        Response := IdHTTP1.Post('http://localhost:8080/', PostData);
      finally
        PostData.Free;
      end;
    end;
    
  • 接收响应时强制UTF-8解析:如果服务器返回的响应头没明确标注charset,手动设置响应的Charset,或者直接获取字节流再转码:
    // 方式1:指定响应字符集
    IdHTTP1.Response.Charset := 'UTF-8';
    var ResponseText := IdHTTP1.Get('http://localhost:8080/');
    
    // 方式2:直接处理字节流,避免自动解析出错
    // var ResponseBytes := IdHTTP1.Get('http://localhost:8080/', nil);
    // var ResponseText := TEncoding.UTF8.GetString(ResponseBytes);
    

额外注意事项

  • 尽量使用较新版本的Indy组件,旧版本对UTF-8的支持存在一些已知bug,升级后能避免很多莫名其妙的编码问题;
  • 如果是GET请求,URL参数必须手动UTF-8编码后再拼接,不能直接把中文/特殊字符放URL里:
    var EncodedParam := TIdURI.URLEncode('đi chơi thôi', TEncoding.UTF8);
    var RequestURL := 'http://localhost:8080/?data=' + EncodedParam;
    var Response := IdHTTP1.Get(RequestURL);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:08:11