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

使用TIdHTTPServer托管HTML文件出现引号乱码,如何解决?

问题原因

你遇到的乱码是字符编码不匹配导致的:

  • 你的HTML文件是UTF-8编码(包含中文全角引号这类多字节字符)
  • 通过TIdHTTPServer返回时,HTTP响应头的ContentType只指定了text/html,没有明确声明字符编码charset=utf-8
  • 浏览器收到响应后,没有从HTTP头获取到编码信息,会用默认的本地编码(比如ISO-8859-1)解析UTF-8字节流,把UTF-8的三字节全角引号e2 80 9c错误解析成了“

本地打开文件正常是因为Edge能直接读取文件的编码标识(比如UTF-8 BOM)或通过内容特征自动识别编码,而HTTP传输时没有传递这个编码信息。

解决方案

修改代码,在设置ContentType时明确添加UTF-8编码声明:

FS:= TFileStream.Create(FN, fmOpenRead);
AResponseInfo.ContentStream:= FS;

FE:= LowerCase(ExtractFileExt(FN));
if FMime.IndexOfName(FE) >= 0 then
  CT:= FMime.Values[FE]
else
  CT:= 'application/octet-stream';

// 针对文本类型添加UTF-8编码声明
if Pos('text/', CT) = 1 then
  CT := CT + '; charset=utf-8';

AResponseInfo.ContentType:= CT;

额外注意事项

  • 确认你的HTML文件确实是UTF-8编码(可以用记事本打开,选择「另存为」查看编码),如果是GB2312/GBK编码,需要把charset=utf-8改成charset=gb2312或charset=gbk
  • 不要让Indy自动处理ContentStream的编码(比如不要设置AResponseInfo.Content属性,直接用Stream返回原始字节流即可)

内容的提问来源于stack exchange,提问作者Jerry Dodge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 12:57:08