230

我有一个旧版应用程序刚刚开始行为不端,无论出于何种原因,我都不确定。它会生成一堆 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
4

8 回答 8

365

在那乱七八糟的某个地方,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 本身进行正则表达式后处理,这始终是一项非常狡猾的业务。

无论如何,现在您可以将以下内容之一添加到您的文档中<head>,看看这是否使它在浏览器中看起来正确:

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

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

于 2009-09-22T19:13:53.790 回答
25

如果有人和我有同样的问题并且字符集已经正确,只需执行以下操作:

  1. 复制 .html 文件中的所有代码。
  2. 打开记事本(或任何基本文本编辑器)并粘贴代码。
  3. 转到“文件->另存为”
  4. 输入您的文件名“example.html”(选择“保存类型:所有文件(.)”)
  5. 选择编码为 UTF-8
  6. 点击保存,您现在可以删除旧的 .html 文件,并且应该修复编码
于 2012-07-04T08:43:44.650 回答
14

问题: 即使我也面临这样的问题,即我们在 POST 请求中向 CRM 系统发送带有一些字符串的'£' ​​,但是当我们从 CRM 进行 GET 调用时,它返回了带有一些字符串内容的 '£' 。所以我们分析的是'£'正在转换为'£'

分析: 我们研究后发现的毛病是在POST调用中我们将HttpWebRequest ContentType设置为“text/xml”,而在GET调用中设置为“text/xml; charset:utf-8”

解决方案: 因此,作为解决方案的一部分,我们在 POST 请求中包含了charset:utf-8并且它可以工作。

于 2015-09-24T04:46:53.917 回答
3

在我的情况下,这(带插入符号)发生在我使用我自己的代码生成工具从 Visual Studio 生成的代码中。很容易解决:

在文档中选择单个空格 ( )。您应该能够看到许多看起来与其他单个空间不同的单个空间,它们没有被选中。选择这些其他单个空格 - 它们负责浏览器中不需要的字符。使用单个空格 ( ) 转到查找和替换。完毕。

PS:将光标放在一个或在VS2017+中选择它会更容易看到所有相似的字符;我希望其他 IDE 可能有类似的功能

于 2020-02-15T18:20:31.887 回答
-1

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

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

于 2013-11-04T12:00:59.880 回答
-2

好吧,我在我的几个网站中也遇到了这个问题,我需要做的就是为 HTML 实体定制内容过滤器。在此之前,我删除的越多,我得到的越多,所以只需更改页面的 html 过滤器或解析功能,它就可以工作了。这主要是由于大多数 CMS 中的 HTML 编辑器。他们存储解析数据的方式导致了这个问题(以我为例)。愿这对你的情况也有帮助

于 2016-03-25T04:01:26.487 回答
-3

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

尽管在 DreamWeaver 中看起来没问题,但当一个“£”标志一直显示为“£”时,我一开始就扯掉了我的头发。最终我记得我在与索引文件相关的链接方面遇到了问题,当页面直接查看时可以与幻灯片一起使用,但与包含一起使用时则不行(但这不是重点。无论如何,我想知道这是否可能是一个类似的问题,因此我没有将其放入我遇到问题的页面中,而是将其放入 index.php 文件中 - 问题始终得到解决。

于 2013-12-16T20:17:33.120 回答
-3

原因是 PHP 无法识别 utf-8。

在这里您可以检查它是否有 HTML 中的所有特殊字符

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

于 2014-06-05T13:50:50.123 回答