小编典典

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

阅读 990

收藏
2020-05-10

共1个答案

小编典典

在混乱的某个地方,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>,看看它是否可以在浏览器中正确显示:

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

如果您这样做了,那么剩下的问题就是ActivePDF的问题。

2020-05-10