由于不确定的原因,我有一个旧版应用程序开始表现异常。它生成一堆HTML,由ActivePDF转换为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
在混乱的某个地方,HTML模板(s)中的不间断空格被编码为ISO-8859-1,因此它们错误地显示为“”字符
那将被编码为UTF-8,而不是ISO-8859-1。不间断空格字符是ISO-8859-1中的字节0xA0;当编码为UTF-8时,它将为0xC2,0xA0,如果(错误地)将其视为ISO-8859-1,则显示为"Â "。其中包括您可能不会注意到的结尾nbsp。如果该字节不存在,则说明您的文档有其他缺陷,我们需要进一步查看以找出问题所在。
"Â "
什么是正则表达式,模板如何工作?如果将您的 字符串(正确)转换为U + 00A0 NON-BREAKING SPACE字符,则似乎在某个地方包含了适当的HTML解析器。如果是这样,您可以只在DOM中本地处理模板,并要求它使用ASCII编码进行序列化以保留非ASCII字符作为字符引用。这也将使您不必再对HTML本身进行正则表达式后处理,而HTML本身一直是一项高度狡猾的业务。
好吧,无论如何,现在您可以将以下内容之一添加到文档中<head>,看看它是否可以在浏览器中正确显示:
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta charset="utf-8">
如果您这样做了,那么剩下的问题就是ActivePDF的问题。