我有一个遗留的应用程序开始表现不佳,无论出于什么原因,我不确定。它生成了一堆HTML,然后由ActivePDF转换为PDF报告。
这个过程是这样的:
从数据库中提取一个HTML模板,其中包含要替换的标记(例如。“~公司名~”,“~客户名~”,等等)
用真实的数据替换这些标记
使用一个简单的regex函数来整理HTML,属性格式HTML标签属性值(确保引号等,因为ActivePDF的呈现引擎不喜欢属性值周围的单引号)
将HTML发送给创建PDF的web服务。
在这些混乱中,HTML模板中的非间断空格被编码为ISO-8859-1,因此当在浏览器(FireFox)中查看文档时,它们错误地显示为“”字符。ActivePDF在这些非utf8字符上呕吐。
我的问题是:因为我不知道问题从哪里来,也没有时间去调查它,有没有一种简单的方法来重新编码或找到并替换坏字符?我试着通过我拼凑的这个小函数发送它,但它把它变成了官样文章,没有改变任何东西。
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
在这些混乱中,来自HTML模板的非间断空格(s)被编码为ISO-8859-1,因此它们错误地显示为“”字符
这将编码为UTF-8,而不是ISO-8859-1。在ISO-8859-1中,不间断空格字符为字节0xA0;当编码为UTF-8时,它将是0xC2,0xA0,如果你(错误地)将其视为ISO-8859-1,结果是“”。这包括一个你可能没有注意到的尾随nbsp;如果这个字节不在那里,那么就有其他东西损坏了文档,我们需要进一步查看以找出是什么东西。
regexp是什么,模板是如何工作的?如果您的 字符串(正确地)被转换为U+00A0非间断空格字符。如果是这样,您可以在DOM中本地处理模板,并要求它使用ASCII编码进行序列化,以保持非ASCII字符作为字符引用。这也将阻止你对HTML本身进行正则表达式的后期处理,这总是一个非常危险的事情。
好吧,无论如何,现在你可以在文档的<head>中添加以下内容之一,看看它在浏览器中是否正确:
HTML4: <meta http-equiv=" content - type " content="text/html;charset=utf-8" />
对于HTML5: <meta charset="utf-8">
如果您已经这样做了,那么任何剩余的问题都是ActivePDF的错误。
在这些混乱中,来自HTML模板的非间断空格(s)被编码为ISO-8859-1,因此它们错误地显示为“”字符
这将编码为UTF-8,而不是ISO-8859-1。在ISO-8859-1中,不间断空格字符为字节0xA0;当编码为UTF-8时,它将是0xC2,0xA0,如果你(错误地)将其视为ISO-8859-1,结果是“”。这包括一个你可能没有注意到的尾随nbsp;如果这个字节不在那里,那么就有其他东西损坏了文档,我们需要进一步查看以找出是什么东西。
regexp是什么,模板是如何工作的?如果您的 字符串(正确地)被转换为U+00A0非间断空格字符。如果是这样,您可以在DOM中本地处理模板,并要求它使用ASCII编码进行序列化,以保持非ASCII字符作为字符引用。这也将阻止你对HTML本身进行正则表达式的后期处理,这总是一个非常危险的事情。
好吧,无论如何,现在你可以在文档的<head>中添加以下内容之一,看看它在浏览器中是否正确:
HTML4: <meta http-equiv=" content - type " content="text/html;charset=utf-8" />
对于HTML5: <meta charset="utf-8">
如果您已经这样做了,那么任何剩余的问题都是ActivePDF的错误。