我有一个遗留的应用程序开始表现不佳,无论出于什么原因,我不确定。它生成了一堆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文件中的所有代码。 打开记事本(或任何基本的文本编辑器)并粘贴代码。 点击文件->另存为 输入您的文件名“example.html”(选择“另存为类型:所有文件(.)”) 选择编码为UTF-8 点击保存,你现在可以删除你的旧的。html文件,编码应该是固定的


在我的情况下,我得到了拉丁十字符号而不是nbsp,甚至一个页面被正确编码为UTF-8。以上都没有帮助解决问题,我尝试了所有。

最后,改变IE的字体(使用浏览器特定的css)有所帮助,我使用Helvetica-Nue作为主体字体更改为Arial解决了这个问题。


我也遇到了同样的问题。显然,这只是因为PHP不识别utf-8。

I was tearing my hair out at first when a '£' sign kept showing up as '£', despite it appearing ok in DreamWeaver. Eventually I remembered I had been having problems with links relative to the index file, when the pages, if viewed directly would work with slideshows, but not when used with an include (but that's beside the point. Anyway I wondered if this might be a similar problem, so instead of putting into the page that I was having problems with, I simply put it into the index.php file - problem fixed throughout.


原因是PHP不识别utf-8。

在这里你可以检查HTML中的所有特殊字符

http://www.degraeve.com/reference/specialcharacters.php


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

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

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


好吧,我在我的几个网站上也有这个问题,我所需要做的就是自定义HTML实体的内容fetler。在那之前,我删除的越多,我得到的就越多,所以只要改变你的HTML fiter或页面的解析功能,它就工作了。这主要是由于大多数cms中的HTML编辑器。他们存储解析数据的方式导致了这个问题(在我的情况下)。也许这对你的情况也有帮助


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

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

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