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


203

由于不确定的原因,我有一个旧版应用程序开始表现异常。它生成一堆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

2
HTML是否包含任何元信息来描述其字符集?
罗兰·肖

1
[以前的评论已删除]简短答案:不。
Cᴏʀʏ

1
对我来说工作:utf8_decode()
ursuleacv

Answers:


340

在混乱的某个地方,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本身进行正则表达式后处理,而HTML本身一直是一项高度狡猾的业务。

好吧,无论如何,现在您可以将以下内容之一添加到文档中<head>,看看它是否可以在浏览器中正确显示:

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

如果这样做,那么剩下的问题就是ActivePDF的错误。


20
我不会推荐<meta charset="utf-8">。该http-equiv版本在HTML5中仍然有效,并且得到了更好的支持。
bobince'2



它适用于所有现代浏览器。当然,它不适用于所有旧版和小众(例如移动)浏览器或所有蜘蛛。
bobince '02

3
“在那乱七八糟的地方”……哈哈!尼斯开放!好答案!+1
抗拒设计

24

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

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

2
这为我做到了。现在它升华了,UTF-8 with BOM而不是UTF-8。要查看这个崇高的文本,你需要show_encoding设置为true在设置-用户。
J86 2013年

我遇到的问题是显示Â而不是»,amd使用此解决方案时,问题已解决,但有php警告: Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at D:\Program Files\wamp\wamp\www\projects\kerala\kerala_public_html\edit\business_details.php:1) in D:\Program Files\wamp\wamp\www\projects\kerala\kerala_public_html\user\include\fg_membersite.php on line 152
SCC

这个解决方案对我有用。我使用的是notepad ++,当我将其以msg的形式保存在ms记事本中时,在notepad ++中打开新文件后,编码设置为UTF-8-BOM(我不确定这是什么意思)。无论如何,这似乎一直是我的问题。
BoltKey

谢谢!这成功了。我在请求/响应中看到文件(在我的情况下为ASPX)被编码为UTF-8。Notepad ++也将其编码为UTF-8。什么鬼,对不对?但是您的解决方案可以解决问题。对我来说,这是一个西班牙语短语,在页面上编码不正确。我在其他地方读过,不要在西班牙语中使用UTF-8 BOM,但它为我修复了该问题。
user3621633

13

问题: 即使我也遇到了这样的问题,即我们在POST请求中向CRM系统发送带有字符串的“£”,但是当我们从CRM进行GET调用时,它返回是带有某些字符串内容的“£”。因此,我们分析的是'£'被转换为'£'

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

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


0

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

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

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


-1

就我而言,我得到的是拉丁十字符号而不是nbsp,即使页面已正确编码为UTF-8。以上没有解决问题的方法,我尝试了所有方法。

在最终更改IE字体(使用特定于浏览器的CSS)的帮助下,我使用Helvetica-Nue作为更改为Arial的主体字体解决了该问题。


之所以切换字体可能有所帮助,可能是因为其中一种字体不包含所讨论的字符,所以您看到的是空字符。但这并不能解决问题,只是掩盖了问题。
奥利弗·豪斯勒

-2

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

尽管当它在DreamWeaver中看起来还不错时,当我始终将“£”符号显示为“£”时,我刚开始拔掉头发。最终,我想起了相对于索引文件的链接时遇到的问题,当直接查看页面时,可以与幻灯片一起使用,但与包含文件一起使用时却不行(但这是重点。无论如何,我想知道这是否可能是类似的问题,所以我没有将其放到遇到问题的页面中,而是将其放到index.php文件中-整个问题都得到解决。



-2

好吧,我在少数几个网站上也遇到了这个问题,我要做的就是为HTML实体自定义内容文件。在此之前,我将其删除的次数也更多,因此只需更改页面的html拟合器或解析函数即可。其主要原因是大多数CMS中的HTML编辑器。他们存储解析数据的方式导致了此问题(就我而言)。可能对您的情况也有帮助

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.