代码之家  ›  专栏  ›  技术社区  ›  Cᴏʀʏ bcherry

HTML编码问题-“”字符出现而不是“,

  •  184
  • Cᴏʀʏ bcherry  · 技术社区  · 15 年前

    我有一个传统的应用程序刚开始出现问题,不管是什么原因,我都不确定。它生成了一组HTML,由activepdf转换成PDF报告。

    过程如下:

    1. 从包含待替换标记的数据库中提取HTML模板(例如“~companyname~”,~customername~”等)。
    2. 用真实数据替换标记
    3. 使用一个简单的regex函数整理HTML,该函数的属性设置HTML标记属性值的格式(确保引号等,因为activepdf的呈现引擎不喜欢属性值周围的单引号之外的任何内容)
    4. 将HTML发送到创建PDF的Web服务。

    在这个混乱的地方,HTML模板中不间断的空格   s)编码为ISO-8859-1,以便在浏览器(firefox)中查看文档时不正确地显示为“_”字符。在这些非utf8字符上激活epdf。

    我的问题是:由于我不知道问题的根源,也没有时间去调查它,有没有一种简单的方法可以重新编码或查找和替换坏字符?我试过通过我拼凑的这个小功能发送它,但是它 把它变成了一本书 不会改变任何事。

    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
    
    7 回复  |  直到 8 年前
        1
  •  316
  •   doppelgreener Perry Tew    9 年前

    在这个混乱的地方,HTML模板(the 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本身进行regex后处理,而HTML本身一直是一个非常棘手的业务。

    好吧,不管怎样,现在你可以在你的文档中添加以下内容之一 <head> 看看这是否使它在浏览器中看起来正确:

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

    如果你做到了,那么剩下的问题就是activepdf的错。

        2
  •  22
  •   Low    10 年前

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

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

    问题: 甚至我也面临着我们发送的问题 “英镑” 在向CRM系统发出后请求时使用了一些字符串,但当我们从CRM进行get调用时,它正在返回 “英镑” 有一些字符串内容。所以我们分析的是 '(' 正在转换为 “英镑” .

    分析: 我们在研究后发现的问题是,在后调用中,我们设置了httpwebrequest ContentType为“文本/XML” 在接电话时 “文本/xml;字符集:utf-8” .

    解决方案: 因此,作为解决方案的一部分,我们将 字符集:UTF-8 在邮政申请和它的工作。

        4
  •  -1
  •   Mohika    11 年前

    在我的例子中,我得到的是拉丁十字符号而不是nbsp,即使是一个页面被正确编码成了UTF-8。以上都没有帮助解决这个问题,我尽力了。

    最后,改变IE字体(使用特定于浏览器的CSS)有所帮助,我使用HelveticaNue作为正文字体,改为Arial解决了这个问题。

        5
  •  -1
  •   JK-Ryder    9 年前

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

        6
  •  -2
  •   FourPart    11 年前

    我也有同样的问题。显然,这仅仅是因为PHP不能识别UTF-8。

    一开始我在扯我的头发,这时一个‘’’符号一直显示为‘’,尽管它在Dreamweaver中看起来没问题。最后,我记得我曾经遇到过与索引文件相关的链接的问题,当直接查看页面时,页面会与幻灯片一起使用,但当与include一起使用时(但这并不重要)。不管怎样,我想知道这是否是一个类似的问题,所以我不把它放在我遇到问题的页面上,而是把它放在index.php文件中——这个问题已经解决了。

        7
  •  -3
  •   al123    11 年前

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

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

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