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