关于vb.net:HTML编码问题 – “?”字符显示而不是“ ”

HTML encoding issues - “?” character showing up instead of “ ”

我有一个遗留应用程序只是开始行为不端,无论出于何种原因,我不它会生成一堆HTML,并由ActivePDF转换为PDF报告。

这个过程是这样的:

  • 从数据库中提取HTML模板,其中包含要更换的标记(例如"~CompanyName~","~CustomName~"等)
  • 用真实数据替换令牌
  • 使用简单的正则表达式函数整理HTML,该函数可以格式化HTML标记属性值(确保引号等,因为ActivePDF的渲染引擎只讨论属性值周围的单引号)
  • 将HTML发送到创建PDF的Web服务。
  • 在这个混乱的地方,HTML模板(  s)中的不间断空格编码为ISO-8859-1,因此它们错误地显示为"?"在浏览器中查看文档时的字符(FireFox)。 ActivePDF会对这些非UTF8字符产生影响。

    我的问题:既然我不知道问题出在哪里,也没有时间去研究它,是否有一种简单的方法可以重新编码或找到并替换坏字符?我已经尝试通过我扔在一起的这个小函数发送它,但是将它全部变成gobbledegook 并没有改变任何东西。

    1
    2
    3
    4
    5
    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

    有任何想法吗?

    编辑:

    我现在正在接受这个,虽然它似乎不是一个好的解决方案:

    1
    2
    3
    Private Shared Function ReplaceNonASCIIChars(ByVal html As String) As String
        Return Regex.Replace(html,"[^\u0000-\u007F]"," ")
    End Function


    Somewhere in that mess, the non-breaking spaces from the HTML template (the  s) are encoding as ISO-8859-1 so that they show up incorrectly as an"?" character

    那就是编码为UTF-8,而不是ISO-8859-1。非中断空格字符是ISO-8859-1中的字节0xA0;当编码为UTF-8时,它是0xC2,0xA0,如果您(错误地)将其视为ISO-8859-1,则显示为"? "。这包括你可能没有注意到的结尾;如果那个字节不存在,那么其他东西已经破坏了你的文档,我们需要进一步了解你的内容。

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

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

    • 对于HTML4:
    • 对于HTML5:

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


    如果任何人遇到与我相同的问题且charset已经正确,只需执行以下操作:

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

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

    分析:
    我们在研究之后发现的故障是在POST调用中我们将HttpWebRequest ContentType设置为"text / xml",而在GET Call中它是"text / xml; charset:utf-8"。

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


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


    就我而言,即使页面被正确编码为UTF-8,我也会得到拉丁十字标志而不是。以上没有任何内容有助于解决问题,我尝试了所有。

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


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

    尽管在DreamWeaver中看起来没问题,但是当'''符号一直显示为'?'时,我才开始撕掉我的头发。最后我记得我遇到了与索引文件相关的链接问题,如果直接查看的页面可以使用幻灯片显示,但是当与包含一起使用时不会(但是就在这一点上。但无论如何我想知道这是否可能是类似的问题,所以我没有把它放入我遇到问题的页面,而是简单地将它放入index.php文件中 - 问题一直在修复。


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

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

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