我希望下载一个可能采用任何可能的文本编码的网页,并将其另存为UTF16LE。假设我可以确定文本的编码(通过检查HTTP标头,HTML标头和/或BOM),我该如何转换文本?
我正在使用Delphi 2009.不幸的是,帮助文件没有解释如何从任何编码转换为Unicode(UTF16LE)字符串。具体问题:
感谢您的建议。
我喜欢直接使用Win32和VCL,但涉及ActiveX控件的答案也可能会有所帮助。
答案 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并有自己的字符集到代码页查找表)。