我有一些 unicode .html 文件,我想在 Delphi 中的 THtmlViewer 组件中显示这些文件。
我似乎无法说服代码仅在执行 '.LoadFromFile' 时工作 - 我是否首先需要将 unicode 文件加载到流中,然后以某种方式对其进行转换?
德尔福 2007, THtmlViewer v9.45
我之前没有对 unicode 文件或 THtmlViewer 做过任何事情。
我有一些 unicode .html 文件,我想在 Delphi 中的 THtmlViewer 组件中显示这些文件。
我似乎无法说服代码仅在执行 '.LoadFromFile' 时工作 - 我是否首先需要将 unicode 文件加载到流中,然后以某种方式对其进行转换?
德尔福 2007, THtmlViewer v9.45
我之前没有对 unicode 文件或 THtmlViewer 做过任何事情。
仅供参考,THTMLViewer 在谷歌代码上得到积极维护(几分钟前最后一次提交): http ://code.google.com/p/thtmlviewer/
D6-DXE2 和 Lazarus 兼容性,从“原始”(9.45)版本进行了大量修复和改进。
好的,这就是我想出的胆量。建设性的批评和观察表示赞赏!
// 将 ansi 或 unicode 类型的 html 文档加载到浏览器组件中。 // 文件名已经被确认为现有文件 过程 TfrmBrowser.LoadDocument(FFileName:string); 变量 FWideText:宽字符串; FAnsiText:AnsiString; FRequiredLen:整数; FFileStream:TFileStream; FMemStream:TMemoryStream; FBuffer:字节; 开始 FFileStream := TFileStream.Create(FFileName, fmOpenRead 或 fmShareDenyNone); // 任何少于六个字节的内容都是没有意义的,但是... 如果 FFileStream.Size>1 然后 开始 // 检查文件的第一个字节,为我们提供有关文件类型的线索 FFileStream.Read(FBuffer,1); FFileStream.Position:=0; // 回退位置 如果 (FBuffer=$FF) 或 (FBuffer=$EF) 那么 开始 // 可能是 Unicode FRequiredLen := FFileStream.Size div 2; // 每个字符 2 个字节 SetLength(FWideText, FRequiredLen); FFileStream.Read(FWideText[1], FFileStream.Size); // 将其转换为 Ansistring FAnsiText := FWideText; FMemStream := TMemoryStream.Create; FMemStream.Write(FAnsiText[1], FRequiredLen); FMemStream.Position := 0; // 回退位置 // 将流加载到 THtmlViewer vwBrowse.LoadFromStream(FMemStream); FMemStream.免费; 结尾 别的 开始 // 可能是 Ansi,只需在其中加载原始文件流 vwBrowse.LoadFromStream(FFileStream); 结尾; FFileStream.Free; 结尾;
显然缺少一些错误捕获,但这是基本思想。
您正在使用 Delphi 2007。那是在 Delphi 编程中 Unicode 时代开始之前!
虽然在 Delphi 的早期版本中让 Unicode 工作很累人,但在一些控件中,特别是 THtmlView 组件,是完全有可能达到令人满意的结果的。
我从我的一个程序中发布了一些代码示例:
//code to toggle source or WYSIWYG views
var
htmEd: IHTMLDocument2;
begin
htmEd := HtmlEdit.Document as IHtmlDocument2;
if ToggleTabSet.TabIndex = 0 then
begin
HtmlEditContainer.PageIndex := 0; // Tab sheet index
htmEd.body.innerHTML := Memo1.Lines.Text; // TTntMemo
pnlEditorState.Caption := 'Design View';
end
else
if ToggleTabSet.TabIndex = 1 then
begin
HtmlEditContainer.PageIndex := 1;
Memo1.Lines.Text := HtmEd.body.innerHTML;
pnlEditorState.Caption := 'Source View';
end;
阅读上面的代码,您可以看到我正在使用一个TTntMemo组件,该组件首先加载了 html 文件。然后我将备忘录的“文本”加载到 HtmlView 的“body.innerHTML”属性。
htmEd.body.innerHTML := Memo1.Lines.Text;
注意:
这就是早期对我有用的方法。我已经切换到 Delphi 2009,现在事情变得容易多了(只需在加载文件时设置合适的 TEncoding)!