使用 Indy TIdHTTPServer:ServeFile() 时如何更改 CharSet?

How to change CharSet when using Indy TIdHTTPServer:ServeFile()?

我的 Javascript、HMTL 等文件正在使用 charset ISO-8859-1 提供,但我需要 charset=utf-8。我试过使用 AResponseInfo->CharSet = "utf-8",但似乎没什么区别。

我已经这样做了,效果很好,但我不想对每个可能的文件扩展名重复测试。

  AResponseInfo->ContentDisposition = "inline";
  if (paths::getExtension(requestedFile, true) == ".JS")
    AResponseInfo->ContentType = "text/javascript; charset=utf-8";

  AResponseInfo->SmartServeFile(AContext, ARequestInfo,uString(requestedFile)); 

(旁注:这可能是因为我使用的 Indy10 版本与 RadStudio 2010 已经有几年的历史了。升级 Indy 的最简单方法是什么?)

side note: This may be because I'm using a version of Indy10 that's a few years old with RadStudio 2010.

那是“几”岁以上,那是十多岁了。 RS2010 于 2009 年发布。自那时以来 TIdHTTPServer 进行了多次更新,包括 2010、2012 和 2019 年的几次 charset-related 更改。

What's the easiest way to upgrade Indy?

最新源码在GitHub:https://github.com/IndySockets/Indy/

Indy 10 Installation Instructions
(注意:link 来自 archive.org 由于 current problems with indyproject.org

升级到最新的 Indy 后,AResponseInfo->CharSet = "utf-8" 应该可以正常工作。

(Smart)ServeFile() 仅当 AResponseInfo->ContentType 属性 为空时设置 AResponseInfo->ContentType

  • 如果新的 ContentType 值指定 charsetAResponseInfo->CharSet 将设置为该值。

  • 否则,如果新的 ContentType 值不包含 charset,并且 AResponseInfo->CharSet 为空,并且新的 ContentType 值为text/... 媒体类型,然后 AResponseInfo->CharSet 设置为默认值,us-ascii 用于 XML 类型,否则 ISO-8859-1.

否则,AResponseInfo->ContentTypeAResponseInfo->CharSet 保持不变,保留调用 (Smart)ServeFile() 之前它们所持有的任何值。

调用AResponseInfo->WriteHeader()时,如果AResponseInfo->ContentType仍然为空,AND AResponseInfo->ContentTextAResponseInfo->ContentStream赋值数据,则AResponseInfo->ContentType设置为text/htmlAResponseInfo->CharSet如果为空则设置为utf-8(RS2009+)或ISO-8859-1(RS2009之前)。

所以,如果你想确保 Content-Type header 中的特定 charset,你应该能够独立地将 AResponseInfo->CharSet 显式设置为任何你想要的在 AResponseInfo->ContentType 的设置中,TIdHTTPServer 现在将尽可能保留 pre-existing CharSet 值。