【问题标题】:How to make PBear's THtmlViewer load & show a unicode HTML file?如何让 Pears Html Viewer 加载并显示 unicode HTML 文件?
【发布时间】:2009-07-25 09:43:41
【问题描述】:

我有一些 unicode .html 文件,我想在 Delphi 中的 THtmlViewer 组件中显示这些文件。

我似乎无法说服代码仅在执行 '.LoadFromFile' 时工作 - 我是否首先需要将 unicode 文件加载到流中,然后以某种方式对其进行转换?

德尔福 2007,THtmlViewer v9.45

我之前没有对 unicode 文件或 THtmlViewer 做过任何事情。

【问题讨论】:

  • 为什么会有“Unicode”html 文件?我假设您的意思是您有 UTF-16/UCS-2 编码 (en.wikipedia.org/wiki/UCS-2) 的文件。最好将生成应用程序更改为以 UTF-8 编码编写它们。 [一般性观察,我对THtmlViewer 没有任何经验。]
  • @mghie - 感谢您的意见。它们是 UTF-16 文件,因为生成它们的程序(不在我的控制范围内)正在像这样输出它们。所以我现在坚持这一点,虽然我希望我也可以接管项目的生成部分,然后正确控制输出格式。

标签: delphi unicode delphi-2007


【解决方案1】:

仅供参考,THTMLViewer 在谷歌代码上得到积极维护(几分钟前最后一次提交): http://code.google.com/p/thtmlviewer/

D6-DXE2 和 Lazarus 兼容性,从“原始”(9.45) 版本进行了大量修复和改进。

【讨论】:

  • 感谢您的信息 - 非常有用!
【解决方案2】:

好的,这就是我想出的内容。建设性的批评和意见表示赞赏!

// 将 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; 结尾;

显然遗漏了一些错误捕获,但这是基本思想。

【讨论】:

    【解决方案3】:

    您使用的是 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;
    

    注意

    1. TntWare 的“Memo1.Lines.Text;”是 WideString 类型。
    2. “IHTMLDocument2”来自TEmbeddedWB。查看why TEmbeddedWB is good? 的原因

    这就是早期对我有用的方法。我已经切换到 Delphi 2009,现在事情变得容易多了(只需在加载文件时设置合适的 TEncoding)!

    【讨论】:

    • 谢谢奥拉夫,这很有趣。我以前没有见过 TTntMemo(等)或 TEmbeddedWB。它们看起来都很有趣,虽然目前我已经设法在 THTMLViewer 下工作并且使用该解决方案也让我对打印有更多的控制(浏览器视图的无对话框打印作为 PDF 等的元文件) -我正在做一场噩梦,以令人满意的方式从 TWebBrowser 控制打印输出。不过,我会为这两个组件添加书签,以便在有时间时仔细查看 - 非常感谢!
    • @robsoft:我正在做一场噩梦,以令人满意的方式从 TWebBrowser 控制打印输出。
    • 嗨奥拉夫,抱歉直到现在才看到这里的评论。我目前正在使用 PBear 组件中的现有东西,因为这是概念验证工作,我可能会以此为起点并开发它(真的想要一些东西从预览中生成令人信服的相似 PDF )。我无法让 TWebBrowser 正确打印预览(这是 IE 的东西,而不是实现的东西),最后客户希望我得到“正确”的预览 - 这是从 TWebBrowser 转移到某些东西的关键驱动力我可以“了解”并更直接地控制。
    猜你喜欢
    • 1970-01-01
    • 2020-06-29
    • 2014-10-26
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    相关资源
    最近更新 更多