使用 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
值指定 charset
,AResponseInfo->CharSet
将设置为该值。
否则,如果新的 ContentType
值不包含 charset
,并且 AResponseInfo->CharSet
为空,并且新的 ContentType
值为text/...
媒体类型,然后 AResponseInfo->CharSet
设置为默认值,us-ascii
用于 XML 类型,否则 ISO-8859-1
.
否则,AResponseInfo->ContentType
和 AResponseInfo->CharSet
保持不变,保留调用 (Smart)ServeFile()
之前它们所持有的任何值。
调用AResponseInfo->WriteHeader()
时,如果AResponseInfo->ContentType
仍然为空,AND AResponseInfo->ContentText
或AResponseInfo->ContentStream
赋值数据,则AResponseInfo->ContentType
设置为text/html
,AResponseInfo->CharSet
如果为空则设置为utf-8
(RS2009+)或ISO-8859-1
(RS2009之前)。
所以,如果你想确保 Content-Type
header 中的特定 charset
,你应该能够独立地将 AResponseInfo->CharSet
显式设置为任何你想要的在 AResponseInfo->ContentType
的设置中,TIdHTTPServer
现在将尽可能保留 pre-existing CharSet
值。
我的 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
值指定charset
,AResponseInfo->CharSet
将设置为该值。否则,如果新的
ContentType
值不包含charset
,并且AResponseInfo->CharSet
为空,并且新的ContentType
值为text/...
媒体类型,然后AResponseInfo->CharSet
设置为默认值,us-ascii
用于 XML 类型,否则ISO-8859-1
.
否则,AResponseInfo->ContentType
和 AResponseInfo->CharSet
保持不变,保留调用 (Smart)ServeFile()
之前它们所持有的任何值。
调用AResponseInfo->WriteHeader()
时,如果AResponseInfo->ContentType
仍然为空,AND AResponseInfo->ContentText
或AResponseInfo->ContentStream
赋值数据,则AResponseInfo->ContentType
设置为text/html
,AResponseInfo->CharSet
如果为空则设置为utf-8
(RS2009+)或ISO-8859-1
(RS2009之前)。
所以,如果你想确保 Content-Type
header 中的特定 charset
,你应该能够独立地将 AResponseInfo->CharSet
显式设置为任何你想要的在 AResponseInfo->ContentType
的设置中,TIdHTTPServer
现在将尽可能保留 pre-existing CharSet
值。