HTML 编码问题 - 显示 "Â"字符而不是 " "

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

流程如下:

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

在困惑中的某个地方,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

最佳答案

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,则会显示为 " " .这包括您可能没有注意到的尾随 nbsp;如果那个字节不存在,那么其他东西已经破坏了您的文档,我们需要进一步查看以找出什么。

什么是正则表达式,模板是如何工作的?如果您的   似乎在某处涉及适当的 HTML 解析器。字符串(正确地)被转换为 U+00A0 NON-BREAKING SPACE 字符。如果是这样,您可以在 DOM 中本地处理您的模板,并要求它使用 ASCII 编码进行序列化,以保留非 ASCII 字符作为字符引用。这也将阻止您对 HTML 本身进行正则表达式后处理,这始终是一项非常狡猾的业务。

无论如何,现在您可以将以下内容之一添加到文档的 <head>看看这是否使它在浏览器中看起来正确:

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

如果你已经这样做了,那么任何剩余的问题都是 ActivePDF 的错。

关于HTML 编码问题 - 显示 "Â"字符而不是 "&nbsp;",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1461907/

相关文章:

validation - 我真的需要将 '&' 编码为 '&' 吗?

html - CSS/HTML : What is the correct way to make

javascript - 有人可以解释这个 'double negative' 技巧吗?

html - 样式化 HTML 电子邮件的最佳实践

html - 放置一个右对齐的按钮

html - 您应该使用 .htm 还是 .html 文件扩展名?有什么区别,哪个文件是正确的?

html - 有人可以解释 HTML5 aria-* 属性吗?

html - 如何设置 dt 和 dd 的样式,使它们在同一行?

javascript - 如何防止点击 '#' 链接跳转到页面顶部?

angularjs - 使用 AngularJS HTML5 模式重新加载页面会给出错误的 GET