使用Delphi 2009下载并保存任何网页为Unicode?

时间:2009-02-07 22:58:44

标签: html delphi http winapi internationalization

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

我正在使用Delphi 2009.不幸的是,帮助文件没有解释如何从任何编码转换为Unicode(UTF16LE)字符串。具体问题:

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

感谢您的建议。

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

2 个答案:

答案 0 :(得分:2)

您打算如何访问该页面?嵌入式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,但您也可以使用任何其他编码。

希望这有帮助。

答案 1 :(得分:2)

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

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