我正在将一个 isapi (pageproducers) 应用程序从 delphi 7 移植到 delphi 2009,这些页面基于 UTF8 中的 html 文件。
一切都很顺利,除了 Onhtmltag 被触发并且我用任何带有特殊字符(如重音字符(áé...))的值替换透明标签时,这些字符在输出中被替换为 � 字符。
怎么了?
我正在将一个 isapi (pageproducers) 应用程序从 delphi 7 移植到 delphi 2009,这些页面基于 UTF8 中的 html 文件。
一切都很顺利,除了 Onhtmltag 被触发并且我用任何带有特殊字符(如重音字符(áé...))的值替换透明标签时,这些字符在输出中被替换为 � 字符。
怎么了?
作为调试过程的一部分,您应该准确找出浏览器接收到的问号字符的字节值。
如您所知,Delphi 2009 的字符串类型是 Unicode,而之前的所有版本都是 ANSI。Delphi 7 引入了该Utf8String
类型,但 Delphi 2009 使该类型变得特殊。如果您不使用该类型来保存编码为 UTF-8 的字符串,那么您应该开始这样做。当您将一个变量分配给另一个变量时,变量中保存的Utf8String
值将自动转换为值。UnicodeString
如果您将 UTF-8 编码的字符串存储在普通AnsiString
变量中,那么如果您将它们分配给UnicodeString
. 那不是你想要的。
如果您将 UTF-8 编码的文字分配给 type 的变量string
,请停止。该类型期望其值被编码为 UTF-16,就像WideString
往常一样。
如果您使用 将文件加载到TStrings
后代中LoadFromFile
,那么您需要开始使用该方法的第二个参数,该参数告诉它使用什么编码。UTF-8 编码的文件应该使用TEncoding.UTF8
. 默认值为TEncoding.Unicode
,即 little-endian UTF-16。
感谢您的帮助,经过一些测试,问题非常简单(或者也很愚蠢)
response.contenttype := 'text/html charset=UTF-8'
无需在 unicodestring utf8string ansistring widestring 之间手动转换。Delphi 2009 字符串使用接近完美。