HTML编码问题- "Â"角色出现而不是“;;;nbsp;;”

我有一个遗留的应用程序开始表现不佳,无论出于什么原因,我不确定。它生成了一堆HTML,然后由ActivePDF转换为PDF报告。

这个过程是这样的:

  1. 从数据库中提取一个HTML模板,其中包含要替换的标记(例如。“~公司名~”,“~客户名~”,等等)
  2. 用真实的数据替换这些标记
  3. 使用一个简单的regex函数来整理HTML,属性格式HTML标签属性值(确保引号等,因为ActivePDF的呈现引擎不喜欢属性值周围的单引号)
  4. 将HTML发送给创建PDF的web服务。

在这个混乱的地方,HTML模板中的非中断空格( s)被编码为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
540367 次浏览

在这些混乱中,HTML模板中的非换行空格被编码为ISO-8859-1,因此它们被错误地显示为“”字符

这将编码为UTF-8,而不是ISO-8859-1。在ISO-8859-1中,不间断空格字符为字节0xA0;当编码为UTF-8时,它将是0xC2,0xA0,如果你(错误地)将其视为ISO-8859-1,结果是" "。这包括一个你可能没有注意到的尾随nbsp;如果这个字节不在那里,那么就有其他东西损坏了文档,我们需要进一步查看以找出是什么东西。

regexp是什么,模板是如何工作的?如果你的 字符串(正确地)被转换成U+00A0非间断空格字符,似乎在某个地方涉及到一个适当的HTML解析器。如果是这样,您可以在DOM中本地处理模板,并要求它使用ASCII编码进行序列化,以保持非ASCII字符作为字符引用。这也将阻止你对HTML本身进行正则表达式的后期处理,这总是一个非常危险的事情。

好吧,无论如何,现在你可以向你的文档的<head>添加以下之一,看看它是否在浏览器中看起来正确:

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

如果您已经这样做了,那么任何剩余的问题都是ActivePDF的错误。

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

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

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

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

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

一开始,当一个“£”标志一直显示为“£”时,我简直要抓狂了,尽管它在DreamWeaver中表现得很好。最终我想起来我一直有相对于索引文件的链接的问题,当页面,如果直接查看可以与幻灯片一起工作,但当与包含一起使用时(但这不是重点)。不管怎样,我想知道这是否可能是一个类似的问题,所以我没有把它放在我有问题的页面中,而是简单地把它放在index.php文件中-整个问题都得到了解决。

原因是PHP不识别utf-8。

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

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

< >强的问题: 甚至我也面临着在POST请求中向CRM系统发送带有一些字符串的“£”的问题,但当我们从CRM执行GET调用时,它返回带有一些字符串内容的“£”。因此,我们所分析的是“£”正在被转换为“£”.

< >强分析: 我们在做研究后发现的故障是,在POST调用中,我们设置了HttpWebRequest 内容类型为"text/xml",而在GET调用中,它是“text / xml;字符集:utf - 8”。< / p >

<强>解决方案: 因此,作为解决方案的一部分,我们在POST请求中包含了utf - 8字符集:,它可以工作

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

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

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

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