代码之家  ›  专栏  ›  技术社区  ›  Francis Lee

Delphi 2009 Unicode+ANSI问题

  •  1
  • Francis Lee  · 技术社区  · 15 年前

    我正在从Delphi7移植一个isapi(pageProducers)应用程序到Delphi2009,这些页面基于utf8格式的HTML文件。

    除了启动onhtmltag,一切都很顺利,我用特殊字符(如重音字符)替换透明标记,这些字符在输出中替换为_?.

    发生了什么?

    3 回复  |  直到 15 年前
        1
  •  4
  •   Rob Kennedy    15 年前

    作为调试过程的一部分,您应该确切了解浏览器为问号字符接收的字节值。

    如您所知,Delphi2009的字符串类型是Unicode,而以前的所有版本都是ANSI。Delphi 7介绍了 Utf8String 类型,但Delphi2009使该类型特别。如果不使用该类型保存编码为UTF-8的字符串,那么应该开始这样做。持有价值 UTF8字符串 变量将转换为 UnicodeString 当您将一个值分配给另一个值时,该值自动生效。

    如果您将UTF-8编码的字符串存储在普通 AnsiString 变量,然后如果将它们分配给 单列字符串 . 这不是你想要的。

    如果要将utf-8编码的文本分配给类型的变量 string 停下来。该类型期望其值编码为utf-16,就像 WideString 总是有的。

    如果要将文件加载到 TStrings 后裔 LoadFromFile ,然后您需要开始使用该方法的第二个参数,该参数告诉它要使用什么编码。UTF-8编码的文件应该使用 TEncoding.UTF8 . 默认值为 TEncoding.Unicode ,即小endian utf-16。

        2
  •  0
  •   Community CDub    7 年前

    这可能是字符编码问题。

    DelphiIDE通常使用Windows-1252或UTF-16编码源代码。 HTML通常使用UTF-8。

    您可能需要在这些编码之间进行一些音译。 为此,你需要找出到底使用了什么编码(比如 Rob 提到)

    或者还原为HTML转义重音字符(如 Ralph 提到)

    你能发布一个显示问题的小应用程序吗?(你可以给我发电子邮件,任何在用户名中有jeroen,域名中有pluimers.com的东西都会到达我的邮箱)。

    ——杰罗恩

        3
  •  0
  •   Francis Lee    15 年前

    谢谢你的帮助,经过一些测试,这个问题非常简单(或者也很愚蠢)。

    response.contenttype := 'text/html charset=UTF-8'
    

    不需要在unicodestring和utf8string之间手动转换,而需要在widestring之间进行转换。Delphi2009字符串的使用接近完美。