提问人:Cᴏʀʏ 提问时间:9/23/2009 最后编辑:Cᴏʀʏ 更新时间:1/16/2022 访问量:572295
HTML 编码问题 - 显示“”字符而不是“ ”
HTML encoding issues - "Â" character showing up instead of " "
问:
我有一个遗留应用程序刚刚开始行为不端,无论出于何种原因,我不确定。它生成一堆 HTML,这些 HTML 被 ActivePDF 转换为 PDF 报告。
该过程的工作原理如下:
- 从数据库中拉取一个 HTML 模板,其中包含要替换的令牌(例如“~CompanyName~”、“~CustomerName~”等)
- 将令牌替换为真实数据
- 使用一个简单的正则表达式函数整理 HTML,该函数将 HTML 标记属性值格式化(确保引号等,因为 ActivePDF 的渲染引擎讨厌属性值周围的单引号)
- 将 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 模板 (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 的错。
评论
<meta charset="utf-8">
http-equiv
如果有人和我有同样的问题,并且字符集已经正确,只需这样做:
- 复制 .html 文件中的所有代码。
- 打开记事本(或任何基本文本编辑器)并粘贴代码。
- 转到“文件 -> 另存为”
- 输入文件名“example.html”(选择“保存类型:所有文件(.)")
- 选择编码为 UTF-8
- 点击保存,您现在可以删除旧的 .html 文件,编码应该已修复
评论
UTF-8 with BOM
UTF-8
show_encoding
true
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
就我而言,我得到的是拉丁十字符号而不是 nbsp,即使页面被正确编码为 UTF-8。以上任何内容都无助于解决问题,我尝试了所有方法。
最后,更改IE的字体(使用特定于浏览器的css)有所帮助,我使用Helvetica-Nue作为正文字体更改为Arial解决了这个问题。
评论
我也有同样的问题。显然,这仅仅是因为 PHP 无法识别 utf-8。
起初,我正在扯头发,当时一个“£”符号一直显示为“⣔,尽管它在 DreamWeaver 中看起来不错。最终,我记得我在与索引文件相关的链接方面遇到了问题,当页面直接查看时,可以与幻灯片一起使用,但在与包含一起使用时则不然(但这不是重点。无论如何,我想知道这是否可能是一个类似的问题,所以我没有放入我有问题的页面,而是简单地将其放入 index.php 文件 - 问题始终已修复。
原因是 PHP 无法识别 utf-8。
在这里,您可以检查HTML中的所有特殊字符
http://www.degraeve.com/reference/specialcharacters.php
评论
问题:即使我面临这样的问题,即我们在 POST 请求中向 CRM 系统发送带有一些字符串的“£”,但是当我们从 CRM 进行 GET 调用时,它会返回带有一些字符串内容的“£”。因此,我们分析的是“£”正在转换为“£”。
分析:我们在研究后发现的故障是,在 POST 调用中,我们将 HttpWebRequest ContentType 设置为“text/xml”,而在 GET Call 中,它是“text/xml;字符集:UTF-8”。
溶液:因此,作为解决方案的一部分,我们在 POST 请求中包含了 charset:utf-8,它可以工作。
好吧,我在我的几个网站中也遇到了这个问题,我需要做的就是为 HTML 实体自定义内容过滤器。在此之前,我删除了更多我得到的它们,所以只需更改页面的 HTML fiter 或解析函数,它就可以工作了。这主要是由于大多数CMS中的HTML编辑器。 他们存储解析数据的方式导致了这个问题(在我的情况下)。愿这对您也有所帮助
就我而言,这(带插入符号)发生在我使用自己的代码生成工具从 Visual Studio 生成的代码中。这很容易解决:
在文档中选择单个空格 ( )。您应该能够看到许多看起来与其他单个空间不同的单个空间,它们未被选中。选择这些其他单个空格 - 它们是负责浏览器中不需要的字符的空格。转到查找并替换为单个空格 ( )。做。
PS:当您将光标放在一个字符上或在VS2017 +中选择它时,更容易看到所有相似的字符;我希望其他IDE可能具有类似的功能
评论