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

