HTML 编码问题 - 显示“”字符而不是“ ”

新手上路,请多包涵

我有一个遗留应用程序刚刚开始行为不端,无论出于何种原因我都不确定。它生成一堆 HTML,这些 HTML 被 ActivePDF 转换为 PDF 报告。

这个过程是这样的:

  1. 从数据库中提取一个 HTML 模板,其中包含要替换的标记(例如“~CompanyName~”、“~CustomerName~”等)
  2. 用真实数据替换令牌
  3. 用一个简单的正则表达式函数整理 HTML,该函数对 HTML 标签属性值进行属性格式化(确保引号等,因为 ActivePDF 的渲染引擎讨厌除了属性值周围的单引号之外的任何东西)
  4. 将 HTML 发送到创建 PDF 的 Web 服务。

在那一团糟的某处,HTML 模板中的不间断空格(   s)被编码为 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

有任何想法吗?

编辑:

我现在正在解决这个问题,尽管它似乎不是一个好的解决方案:

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

原文由 Cᴏʀʏ 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 847
2 个回答

在那一团糟的某个地方,HTML 模板中的不间断空格 (the s) 被编码为 ISO-8859-1,因此它们错误地显示为“”字符

那将编码为 UTF-8,而不是 ISO-8859-1。不间断空格字符是ISO-8859-1中的字节0xA0;当编码为 UTF-8 时,它将是 0xC2,0xA0,如果您(错误地)将其视为 ISO-8859-1,则输出为 " " 。这包括您可能没有注意到的尾随 nbsp;如果那个字节不存在,那么其他东西已经损坏了您的文档,我们需要进一步查看以找出是什么。

什么是正则表达式,模板如何工作?如果您的   字符串(正确地)被转换为 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 的错。

原文由 bobince 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果有人遇到与我相同的问题并且字符集已经正确,只需执行以下操作:

  1. 复制 .html 文件中的所有代码。
  2. 打开记事本(或任何基本的文本编辑器)并粘贴代码。
  3. 转到“文件 - >另存为”
  4. 输入文件名“example.html”(选择“保存类型:所有文件( . )”)
  5. 选择编码为 UTF-8
  6. 点击保存,您现在可以删除旧的 .html 文件,编码应该是固定的

原文由 Low 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题