【问题标题】:Download and save any web page as Unicode, using Delphi 2009?使用 Delphi 2009 下载任何网页并将其保存为 Unicode?
【发布时间】:2009-02-07 22:58:44
【问题描述】:

我希望下载一个网页,它可以是任何可能的文本编码,并将其保存为 UTF16LE。假设我可以确定文本的编码(通过检查 HTTP 标头、HTML 标头和/或 BOM),我该如何转换文本?

我使用的是 Delphi 2009。不幸的是,帮助文件没有说明如何将 any 编码转换为 Unicode (UTF16LE) 字符串。具体问题:

  • 我可以通过在 AnsiString 上设置正确的编码并将其分配给 UnicodeString 来完成转换吗?
  • 如果是这样,我如何将可能标记网页的各种“字符集”描述(Big5、Shift-JIS、UTF-32 等)转换为正确的格式来初始化 AnsiString?

感谢您的建议。

我倾向于直接使用 Win32 和 VCL,但涉及 ActiveX 控件的答案也可能会有所帮助。

【问题讨论】:

    标签: html delphi http winapi internationalization


    【解决方案1】:

    您将如何访问该页面?嵌入式 Internet Explorer、INDY、第三方工具……?这可能会影响答案,因为它决定了输入字符串的格式。

    第 1 部分:获取页面

    如果您使用嵌入式 Internet Explorer (TWebBrowser) 访问页面,事情就非常简单:

    var htmlElement:IHTMLElement;
        myText:String;
    begin
      // Get access to the HTML element of the document:
      htmlElement:=(WebBrowserControl.DefaultInterface.Document as IHTMLDocument3).documentElement;
      // Receive the full HTML of the web page:
      myText:=htmlElement.OuterHTML;
    

    网页的编码应该由 IE 和 Delphi 正确处理,您最终会得到一个包含结果的UnicodeString(示例中为myText)。

    第 2 部分:以 UTF-16LE 保存

    无论您的字符串来自何处 - 您都可以将其保存为所需的编码:

    var s:TStringStream;
    begin
      s:=TStringStream.Create(myText, TEncoding.Unicode, false);
      s.SaveToFile('yourFileToSaveTo.txt');
      FreeAndNil(s);
    end;
    

    TEncoding.Unicode 是 UTF-16LE,但您也可以使用任何其他编码。

    希望这会有所帮助。

    【讨论】:

    • 我想警告一下使用 TWebBrowser,因为它带来了 IE 的行为。可能阻止您使用 TWebBrowser 获取页面源的因素包括:多个 IE 安全设​​置弹出手动确认框、Javascript 错误、ActiveX 控件、其他不兼容问题或任何外部链接(例如页面上的广告)导致弹出窗口、Windows 和可能防火墙/病毒软件可能会导致弹出窗口,如果请求的源不是 mime 类型的 HTML,您将获得“另存为”弹出窗口。不要使用它,这是我的建议。有很多替代品,例如 Synapse。
    【解决方案2】:

    在 D2009 及更高版本中,Indy 10 的 TIdHTTP 组件会自动为您将接收到的网页解码为 UTF-16。

    在 Windows 上进行字符集到 Unicode 的转换需要使用代码页(除非您使用 ICONV 库),因此您必须先将字符集名称转换为合适的代码页,然后才能使用 TEncoding.GetEncoding( ) 和 TEncoding.GetString(),或在 RawByteString(不是 AnsiString)上调用 SetCodePage(),然后将其分配给 UnicodeString,以进行转换(在内部,Indy 使用 TEncoding 并有自己的字符集到代码页查找表)。

    【讨论】:

      猜你喜欢
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 2018-06-08
      • 2010-09-12
      • 1970-01-01
      • 2013-05-20
      • 2010-11-28
      相关资源
      最近更新 更多