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

HTML encoding issues - "Â" character showing up instead of " "

提问人:Cᴏʀʏ 提问时间:9/23/2009 最后编辑:Cᴏʀʏ 更新时间:1/16/2022 访问量:572295

问:

我有一个遗留应用程序刚刚开始行为不端,无论出于何种原因,我不确定。它生成一堆 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 字符上呕吐。 

我的问题是:既然我不知道问题的根源,也没有时间调查它,有没有一种简单的方法来重新编码或查找和替换坏字符?我试过通过我拼凑的这个小函数发送它,但它把它全部变成了狼吞虎咽并没有改变任何事情。

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
HTML vb.net 编码 UTF-8 ISO-8859-1

评论

2赞 Rowland Shaw 9/23/2009
HTML 是否包含任何元信息来描述其字符集?
1赞 Cᴏʀʏ 9/23/2009
[先前评论已删除]简短的回答:不。
1赞 ursuleacv 2/23/2017
对我来说工作:utf8_decode()

答:

392赞 bobince 9/23/2009 #1

在这种混乱的某个地方,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-BREAK 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 的错。

评论

23赞 bobince 2/19/2012
我还不推荐。该版本在 HTML5 中仍然有效,并且得到了更好的支持。<meta charset="utf-8">http-equiv
9赞 Richard Ayotte 2/19/2012
使用哪一个的答案:<meta charset='utf-8'> vs <meta http-equiv='Content-Type' 声明短版本得到了很好的支持。
1赞 Richard Ayotte 2/19/2012
找到另一个来源 这适用于所有浏览器
0赞 bobince 2/20/2012
它适用于所有现代浏览器。它当然不适用于所有传统和利基(例如移动)浏览器,或所有蜘蛛。
3赞 Resist Design 9/3/2012
“在那片烂摊子的某个地方”......哈哈!不错的开放!好答案!+1
25赞 Low 7/4/2012 #2

如果有人和我有同样的问题,并且字符集已经正确,只需这样做:

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

评论

2赞 J86 12/31/2013
这为我做到了。现在在崇高中,它说而不是.要在崇高的文本中查看此内容,您需要在“设置”-“用户”中设置为。UTF-8 with BOMUTF-8show_encodingtrue
0赞 SCC 3/6/2014
我遇到了显示 Â 而不是 » 的问题,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
0赞 BoltKey 3/19/2017
这个解决方案对我有用。我在记事本++中工作,当我将其保存在基本的ms记事本中为UTF-8时,在记事本++中打开新文件后,编码设置为UTF-8-BOM(我不确定这意味着什么)。无论如何,这似乎是我的问题。
0赞 user3621633 7/13/2019
谢谢!这成功了。我在请求/响应中看到文件(在我的情况下是 ASPX)被编码为 UTF-8。Notepad++ 也将其编码为 UTF-8。这到底是怎么回事,对吧?但你的解决方案做到了。对我来说,这是一个西班牙语短语,在页面上没有正确编码。我在其他地方读到不要将 UTF-8 BOM 用于西班牙语,但它为我修复了它。
-1赞 Mohika 11/4/2013 #3

就我而言,我得到的是拉丁十字符号而不是 nbsp,即使页面被正确编码为 UTF-8。以上任何内容都无助于解决问题,我尝试了所有方法。

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

评论

0赞 Oliver Hausler 10/24/2019
切换字体可能有帮助的原因可能是因为其中一种字体不包含相关字符,因此您看到的是一个空字符。但这并没有解决问题,它只是掩盖了它。
-4赞 FourPart 12/17/2013 #4

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

起初,我正在扯头发,当时一个“£”符号一直显示为“⣔,尽管它在 DreamWeaver 中看起来不错。最终,我记得我在与索引文件相关的链接方面遇到了问题,当页面直接查看时,可以与幻灯片一起使用,但在与包含一起使用时则不然(但这不是重点。无论如何,我想知道这是否可能是一个类似的问题,所以我没有放入我有问题的页面,而是简单地将其放入 index.php 文件 - 问题始终已修复。

-3赞 al123 6/5/2014 #5

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

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

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

评论

1赞 Cᴏʀʏ 6/5/2014
这不是一个关于PHP的问题,而是 VB.NET 的问题。
0赞 al123 6/5/2014
我不,但是您可以使用这些字符来解决问题.这解决了我的解决方案。
0赞 egmfrs 5/24/2023
这实际上是对我最有帮助的答案。我猜想,提到PHP会让其他人望而却步,但这个原则是普遍的。因此,在我的情况下,我不必纠结上下文类型或编码配置,而只需将 £ 字符替换为 &pound;
16赞 Himanshu Tarsoliya 9/24/2015 #6

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

分析:我们在研究后发现的故障是,在 POST 调用中,我们将 HttpWebRequest ContentType 设置为“text/xml”,而在 GET Call 中,它是“text/xml;字符集:UTF-8”。

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

-3赞 JK-Ryder 3/25/2016 #7

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

3赞 Hannington Mambo 2/16/2020 #8

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

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

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