我有一个遗留的应用程序刚刚开始运行不正常,不知什么原因,我不确定.它生成一系列HTML,然后由ActivePDF转换成PDF报告.

过程如下:

  1. 从数据库中提取一个HTML模板,其中包含要替换的标记(例如"~CompanyName~"、"~CustomerName~"等)
  2. 用真实数据替换令牌
  3. 使用一个简单的正则表达式函数整理HTML,该函数属性格式化HTML标记属性值(确保引号等,因为ActivePDF的呈现引擎不喜欢属性值周围的单引号)
  4. 将HTML发送到创建PDF的web服务.

在混乱中的某个地方,HTML模板中的不间断空格( )编码为ISO-8859-1,因此在浏览器(Firefox)中查看文档时,它们错误地显示为""字符.ActivePDF在这些非UTF8字符上呕吐.

我的问题是:由于我不知道问题的根源,也没有时间进行调查,有没有简单的方法可以重新编码或查找并替换坏字符?我试着通过我拼凑的这个小函数发送它,但是把它全部变成了gobbledegook不会改变任何事情.

Private Shared Function ConvertToUTF8(ByVal html As String) As String
    Dim isoEncoding As Encoding = Encoding.GetEncoding("iso-8859-1")
    Dim source As Byte() = isoEncoding.GetBytes(html)
    Return Encoding.UTF8.GetString(Encoding.Convert(isoEncoding, Encoding.UTF8, source))
End Function

有什么主意吗?

EDIT:

我现在还可以接受这个问题,尽管这似乎不是一个好的解决方案:

Private Shared Function ReplaceNonASCIIChars(ByVal html As String) As String
    Return Regex.Replace(html, "[^\u0000-\u007F]", " ")
End Function

推荐答案

Somewhere in that mess, the non-breaking spaces from the HTML template (the  s) are encoding as ISO-8859-1 so that they show up incorrectly as an "Â" character

那就是编码成UTF-8,而不是ISO-8859-1.ISO-8859-1中的不间断空格字符为字节0xA0;当编码为UTF-8时,它将是0xC2,0xA0,如果您(错误地)将其视为ISO-8859-1,它将显示为" ".这包括一个你可能没有注意到的问题;如果那个字节不在那里,那么您的文档就被其他东西损坏了,我们需要进一步查看以找出原因.

什么是regexp,模板是如何工作的?如果您的 个字符串(正确地)被转换为U+00A0不间断空格字符,那么似乎在某个地方需要一个合适的HTML解析器.如果是这样,您可以在DOM中以本机方式处理模板,并要求它使用ASCII编码进行序列化,以保留非ASCII字符作为字符引用.这也将使您不再需要对HTML本身进行正则表达式后处理,这一直是一项非常棘手的业务.

不管怎样,现在你可以在文档的<head>中添加以下内容之一,看看这是否能让它在浏览器中显示正确:

  • 对于HTML4:<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  • 对于HTML5:<meta charset="utf-8">

如果你已经做到了,那么剩下的任何问题都是ActivePDF的错.

Html相关问答推荐

HTML横幅未正确对齐页面顶部

CSS动画积分计数器

在浮动元素旁边垂直居中

如何让QML`Text`元素内的链接在悬停时显示鼠标指针?

如何在元素的三条边中间换行边框?

如何收集<;p&>元素下的<;p>;子元素

为什么在移动视图中,这个水平可滚动的表格会在表格的右侧显示额外的空间?

有没有一种方法可以动态地从网格或Flexbox中取出HTML元素?

在窄屏幕上显示表格,每个单元格占一行

更改Angular 为17的material Select 字段的高度?

获取标准的Python脚本,以便使用FASK对网站进行Flask

如何在ASP.NET Core中添加换行符

使用不同字体对齐元素

我在桌面版 html css 代码上给出了位置 margin-left margin-top 标签,如何将其删除到手机上以使其响应?

如何实现与内嵌图像对齐的自动换行?

需要帮助个性化我的 CSS 导航栏:如何在鼠标悬停时突出显示
  • 元素?
  • 我正在使用 NVDA 并多次读取关闭按钮,但它的读取非常完美

    为什么使用 Css 只能看到 1 列而不是 3 列?

    在 SQL 中合并 HTML 表中的单元格

    HTML 标记未在页面上展开