我有一个遗留的应用程序开始表现不佳,无论出于什么原因,我不确定。它生成了一堆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实体的内容fetler。在那之前,我删除的越多,我得到的就越多,所以只要改变你的HTML fiter或页面的解析功能,它就工作了。这主要是由于大多数cms中的HTML编辑器。他们存储解析数据的方式导致了这个问题(在我的情况下)。也许这对你的情况也有帮助

其他回答

在我的情况下,这(一个插入)发生在我从visual studio生成的代码中,使用我自己的工具来生成代码。这个问题很容易解决:

在文档中选择单个空格()。你应该可以看到很多单独的空间看起来与其他单独的空间不同,它们没有被选中。选择这些单独的空格——它们负责浏览器中不需要的字符。使用单个空格()查找和替换。完成了。

PS:当你把光标放在一个字符上或在VS2017+中选择它时,更容易看到所有相似的字符;我希望其他ide也有类似的功能

问题: 甚至我也面临着这样的问题,我们在POST请求中将'£'与一些字符串发送到CRM系统,但当我们从CRM执行GET调用时,它返回'£'与一些字符串内容。所以我们分析的是“£”被转换为“£”。

分析: 我们在做研究后发现的故障是,在POST调用中,我们已经将HttpWebRequest ContentType设置为“text/xml”,而在GET调用中,它是“text/xml;字符集:utf - 8”。

解决方案: 因此,作为解决方案的一部分,我们在POST请求中包含了字符集:utf-8,它是有效的。

如果有人和我有同样的问题,而且字符集已经正确了,那么就简单地这样做:

复制.html文件中的所有代码。 打开记事本(或任何基本的文本编辑器)并粘贴代码。 点击文件->另存为 输入您的文件名“example.html”(选择“另存为类型:所有文件(.)”) 选择编码为UTF-8 点击保存,你现在可以删除你的旧的。html文件,编码应该是固定的

在这些混乱中,来自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实体的内容fetler。在那之前,我删除的越多,我得到的就越多,所以只要改变你的HTML fiter或页面的解析功能,它就工作了。这主要是由于大多数cms中的HTML编辑器。他们存储解析数据的方式导致了这个问题(在我的情况下)。也许这对你的情况也有帮助