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

Posted

技术标签:

【中文标题】HTML 编码问题 - 显示“”字符而不是“ ”【英文标题】:HTML encoding issues - "Â" character showing up instead of " " 【发布时间】:2010-11-30 12:28:54 【问题描述】:

我有一个旧版应用程序刚刚开始出现异常,无论出于何种原因我都不确定。它会生成一堆 html,这些 HTML 会被 ActivePDF 转换为 PDF 报告。

流程如下:

    从数据库中提取一个 HTML 模板,其中包含要替换的标记(例如“~CompanyName~”、“~CustomerName~”等) 用真实数据替换令牌 使用简单的正则表达式函数整理 HTML,该函数可以对 HTML 标记属性值进行属性格式化(确保引号等,因为 ActivePDF 的渲染引擎讨厌任何东西,除了属性值周围的单引号) 将 HTML 发送到创建 PDF 的 Web 服务。

在混乱中的某个地方,HTML 模板中的不间断空格( s)被编码为 ISO-8859-1,因此在查看文档时,它们会错误地显示为“”字符浏览器(火狐)。 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

【问题讨论】:

HTML 是否包含任何元信息来描述其字符集? [以前评论删除] 简答:没有。 为我工作:utf8_decode() 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

在混乱中的某个地方,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 本身进行正则表达式后处理,这始终是一项非常狡猾的业务。

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

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

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

【讨论】:

我还不推荐&lt;meta charset="utf-8"&gt;http-equiv 版本在 HTML5 中仍然有效并且得到更好的支持。 Which one to Use: <meta charset='utf-8'> vs <meta http-equiv='Content-Type' 的回答表明短版本得到了很好的支持。 找到另一个来源This works in all browsers 它适用于所有现代浏览器。它当然不适用于所有旧版和小众(例如移动)浏览器或所有蜘蛛。 “混乱中的某个地方”...哈哈!好开!好答案! +1【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

这是为我做的。现在在崇高它说UTF-8 with BOM 而不是UTF-8。要在崇高的文本中看到这一点,您需要在设置 - 用户中将 show_encoding 设置为 true 我遇到了显示 Â 而不是 » 的问题,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 这个解决方案对我有用。我在记事本++中工作,当我在基本的ms记事本中将其保存为UTF-8时,在记事本++中打开新文件后,编码设置为UTF-8-BOM(我不确定这是什么意思)。无论如何,这似乎是我的问题。 谢谢!这成功了。我在请求/响应中看到文件(在我的例子中是 ASPX)被编码为 UTF-8。 Notepad++ 也将其编码为 UTF-8。什么鬼,对吧?但你的解决方案成功了。对我来说,这是一个西班牙语短语,在页面上没有正确编码。我在其他地方读过不要将 UTF-8 BOM 用于西班牙语,但它为我修复了它。【参考方案6】:

这是因为 PHP 无法识别 utf-8。

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

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

【讨论】:

这不是关于 PHP 的问题,它是 VB.NET。 我没有,但是您可以使用这些字符来解决问题。这解决了我的解决方案。【参考方案7】:

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

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

【讨论】:

【参考方案8】:

在我的情况下,我得到的是拉丁十字符号而不是 nbsp,即使页面被正确编码为 UTF-8。以上没有任何帮助解决问题,我尝试了所有。

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

【讨论】:

切换字体可能有帮助的原因可能是因为其中一种字体不包含有问题的字符,所以您看到的是一个空字符。但这并没有解决问题,只是掩盖了问题。

以上是关于HTML 编码问题 - 显示“”字符而不是“ ”的主要内容,如果未能解决你的问题,请参考以下文章

为啥 PuTTYcyg 在手册页中显示 â 而不是连字符?

(PHP) rawurlencode/decode 似乎将 '£' 符号编码为 '£' (%C2%A3 而不是 %A3)

“’” 显示在页面上,而不是“'”

如何检测我的安卓手机是不是不支持某个字符?

MySQL UTF8/ASCII/ISO 编码问题

如何修复双编码 UTF8 字符(在 utf-8 表中)