HTML编码问题 - “”字符显示而不是“”

时间:2009-09-22 18:48:07

标签: html vb.net encoding utf-8 iso-8859-1

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

这个过程是这样的:

  1. 从数据库中提取HTML模板,其中包含令牌(例如“〜CompanyName~”,“~CustomerName~”等)。
  2. 用真实数据替换令牌
  3. 使用简单的正则表达式函数整理HTML,该函数可以格式化HTML标记属性值(确保引号等,因为ActivePDF的渲染引擎只讨论属性值周围的单引号)
  4. 将HTML发送到创建PDF的网络服务。
  5. 在那个烂摊子的某个地方,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
    

8 个答案:

答案 0 :(得分:324)

  

在那个混乱的地方,HTML模板(s)中的不间断空格编码为ISO-8859-1,因此它们错误地显示为“”字符

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

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

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

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

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

答案 1 :(得分:23)

如果任何人遇到与我相同的问题并且字符集已经正确,只需执行此操作:

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

答案 2 :(得分:11)

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

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

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

答案 3 :(得分:2)

就我而言,这(带有尖号)发生在我使用自己的代码生成工具从Visual Studio生成的代码中。很容易解决:

在文档中选择单个空格()。您应该能够看到许多看起来与其他单个空格不同的单个空格,但未选中它们。选择这些其他单个空格-它们是导致浏览器中不需要的字符的空格。转到查找并替换为单个空格()。完成。

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

答案 4 :(得分:-1)

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

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

答案 5 :(得分:-1)

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

答案 6 :(得分:-2)

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

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

答案 7 :(得分:-3)

原因是PHP没有识别utf-8。

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

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