【问题标题】:Indy server replaces specific charactersIndy 服务器替换特定字符
【发布时间】:2020-05-06 14:29:36
【问题描述】:

我试图使用 Indy 为某种网页制作自己的网络服务器。在我的母语中,我经常使用 'Ő' 和 'Ű' 字符,这很好,但由于某种原因,在服务器将 html 文件发送到浏览器后,这些字符被替换为 'O' 和'你'。我已经烦了一个星期了,我不知道为什么会这样。我需要在服务器上设置什么,才能正确发送页面?感谢您的帮助!

【问题讨论】:

  • 您需要对您的网页进行UTF8编码,并声明该网页包含UTF8。
  • 如何声明网页包含UTF8?我需要使用什么元数据?
  • 我已经尝试了其中提到的一些解决方案,但它们没有帮助。另外,我在服务器上工作,而不是在客户端上。
  • @KissKonrád 您正在将文件数据读入StringContentText,从UTF-8 转换为UTF-16。但是您并没有告诉 Indy 在传输到 Web 浏览器时将 ContentText 转换回 UTF-8,或者告诉 Web 浏览器文本是 UTF-8。由于您从磁盘提供文件,请考虑使用ContentStream 而不是ContentText,例如:AResponseInfo.ContentType := 'text/html; charset=utf-8'; AResponseInfo.ContentStream := TIdReadFileExclusiveStream.Create(Pages[I].FileName);

标签: delphi utf-8 indy indy10 delphi-10.3-rio


【解决方案1】:

您只需要像这样定义响应字符集:

procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
begin
  AResponseInfo.ContentType := 'text/plain';
  AResponseInfo.CharSet := 'utf-8';
  AResponseInfo.ContentText := 'Hallo Web ŐŰ';
end;

【讨论】:

  • 我这样写了字符集:UTF-8,而不是小写。非常感谢!
  • 这应该没什么区别。我用 Chrome 对其进行了测试,它不区分大小写。
  • 将内容加载到内存并转换为字符串可能不是一个好主意。最好按照 Remy 在 cmets 中描述的方式使用流
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
  • 2014-11-03
  • 1970-01-01
  • 2022-01-05
  • 2013-06-02
  • 1970-01-01
相关资源
最近更新 更多