我正在将 isapi(页面生成器)应用程序从 delphi 7 移植到 delphi 2009,这些页面基于 UTF8 格式的 html 文件。
一切都很顺利,除了 Onhtmltag 被触发时,我将透明标签替换为带有特殊字符的任何值,例如重音字符 (áé...) 这些字符在输出中被替换为 � 字符。
出了什么问题?
最佳答案
作为调试过程的一部分,您应该准确找出浏览器接收到的问号字符的字节值。
如您所知,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
,即小端 UTF-16。
关于delphi 2009 unicode + ansi问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1201701/