我将一个isapi(pageproducers)应用程序从delphi 7移植到delphi 2009,这些页面基于UTF8中的html文件。delphi 2009 unicode + ansi问题
除了当Onhtmltag被触发时,我会用一些特殊字符(如重音字符)替换透明标记(áé...),这些字符在输出中用 字符替换。
怎么了?
我将一个isapi(pageproducers)应用程序从delphi 7移植到delphi 2009,这些页面基于UTF8中的html文件。delphi 2009 unicode + ansi问题
除了当Onhtmltag被触发时,我会用一些特殊字符(如重音字符)替换透明标记(áé...),这些字符在输出中用 字符替换。
怎么了?
作为调试过程的一部分,您应该确切了解浏览器收到的问号字符的字节值。你应该知道,Delphi 2009的字符串类型是Unicode,而以前的所有版本都是ANSI。德尔福7引入了Utf8String
类型,但德尔福2009年使这种类型特别。如果您不使用该类型来保存编码为UTF-8的字符串,那么您应该开始这样做。当您将一个变量分配给另一个变量时,Utf8String
变量中保存的值将自动转换为UnicodeString
值。
如果您将UTF-8编码的字符串存储在普通的AnsiString
变量中,那么如果将它们分配给UnicodeString
,它们将使用默认系统代码页转换为Unicode。这不是你想要的。
如果您将UTF-8编码的文字分配给类型为string
的变量,请停止该操作。该类型期望其值被编码为UTF-16,就像WideString
一直有的一样。
如果您正在将文件加载到TStrings
后代LoadFromFile
,那么您需要开始使用该方法的第二个参数,该参数告诉它使用哪种编码。 UTF-8编码文件应该使用TEncoding.UTF8
。缺省值是TEncoding.Unicode
,它是小端的UTF-16。
感谢你的帮助,经过一番测试,问题是非常非常简单的(或愚蠢也)
response.contenttype := 'text/html charset=UTF-8'
没有必要的UnicodeString UTF8字符串WideString的AnsiString类型之间进行手动转换。德尔福2009年的字符串使用率接近完美。
+1,希望我能给+2。紧凑且信息丰富。 – Argalatyr 2009-07-30 00:04:48