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

