我有一个遗留应用程序刚刚开始行为不端,无论出于何种原因我都不确定。它生成一堆 HTML,这些 HTML 被 ActivePDF 转换为 PDF 报告。
这个过程是这样的:
- 从数据库中提取一个 HTML 模板,其中包含要替换的标记(例如“~CompanyName~”、“~CustomerName~”等)
- 用真实数据替换令牌
- 用一个简单的正则表达式函数整理 HTML,该函数对 HTML 标签属性值进行属性格式化(确保引号等,因为 ActivePDF 的渲染引擎讨厌除了属性值周围的单引号之外的任何东西)
- 将 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 许可协议
那将编码为 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>
并查看它是否使它在浏览器中看起来正确:<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta charset="utf-8">
如果你这样做了,那么剩下的任何问题都是 ActivePDF 的错。