为什么“”被注入我的HTML?

时间:2013-08-28 03:19:30

标签: html encoding sublimetext2

编辑:您可以看到问题here(查看来源)。

EDIT2:有趣的是,来源中存在问题。仅限控制台(Firebug)。

我在名为test.html的文件中有以下标记:

​<!DOCTYPE html>
<html>
<head>
    <title>Test Harness</title>
    <link href='/css/main.css' rel='stylesheet' type='text/css' />
</head>
<body>
    <h3>Test Harness</h3>
</body>
</html>

但在Chrome中,我看到了:

<!DOCTYPE html>
<html>
<head>
</head>
<body>
    "&#8203;


        "
    <title>Test Harness</title>
    <link href='/css/main.css' rel='stylesheet' type='text/css' />
    <h3>Test Harness</h3>
</body>
</html>

看起来&#802是一个零宽度的空间,但究竟是什么造成的呢?我使用带有UTF-8编码的Sublime Text 2和带有Jinja2的Google App Engine(但Jinja只是加载test.html)。有什么想法吗?

提前致谢。

8 个答案:

答案 0 :(得分:26)

这是来源中的一个问题。您提供的live example以以下字节开头(即它们出现在<!DOCTYPE html>之前):0xE2 0x80 0x8B。这可以看作例如通过选择“显示格式”下的“Hex”,使用Rex Swain的HTTP Viewer。另请注意,validating带有W3C标记验证器的页面提供的信息表明文档开头有一些非常错误的信息,特别是消息“第1行,第1列:未查看非空格字符doctype first。“

验证工具和Chrome工具中会发生什么 - 以及在Firebug中 - 字节0xE2 0x80 0x8B被视为字符数据,它隐含地启动body元素(因为字符数据无法有效地出现在head元素中或之前),这意味着空{它之前的{1}}元素。

当然,解决方案是删除这些字节。浏览器通常会忽略它们,但您不应该依赖此类错误处理,并且字节会阻止有用的HTML验证。你如何删除它们以及它们如何到达那里取决于你的创作环境。

由于页面被声明(在HTTP标头中)为UTF-8编码,因此这些字节代表ZERO WIDTH SPACE(U + 200B)字符。它没有可见的字形,也没有宽度,因此即使浏览器将其视为head元素开头的数据,您也不会在视觉呈现中发现任何内容。符号body是它的字符引用,可能被浏览器工具用来表示通常不可见的字符的存在。

生成HTML文档的软件可能会插入ZERO WIDTH NO-BREAK SPACE(U + FEFF)。这本来是有效的,因为通过一个特殊约定,UTF-8编码数据可以从这个字符开始,也称为字节顺序标记(BOM),当出现在数据的开头时。使用U + 200B而不是U + FEFF听起来像软件不太可能犯的错误,但如果他们想到字符的Unicode 名称,那么人类可能会错误。

答案 1 :(得分:9)

我了解SharePoint 2013中存在一个错误,HTML编辑器会将这些字符添加到您的内容中。

我一直在处理这个问题,这是我正在使用的解决方案似乎正在起作用。我将此javascript添加到我的母版页引用的文件中。

var elements = ["h1","h2","h3","h4","p","strong","label","span","a"];
function targetZWS(){
    for (var i = 0; i < elements.length; i++) {
      jQuery(elements[i]).each(function() {
        removeZWS(this);
      });
    }
}
function removeZWS(target) {
  jQuery(target).html(jQuery(target).html().replace(/\u200B/g,''));
}

/*load functions*/
$(document).ready(function() {
    _spBodyOnLoadFunctionNames.push("targetZWS");

});

链接我调查了这个:

  1. https://social.msdn.microsoft.com/Forums/sharepoint/en-US/23804eed-8f00-4b07-bc63-7662311a35a4/why-does-sharepoint-put-in-character-code-8203-in-a-richtext-field?forum=sharepointdevelopment

  2. https://social.technet.microsoft.com/Forums/office/en-US/e87a82f0-1ab5-4aa7-bb7f-27403a7f46de/finding-8203-unicode-characters-in-my-source-code?forum=sharepointgeneral

  3. http://www.sharepointpals.com/post/Removing-8203-in-RichTextHTML-field-Sharepoint

答案 2 :(得分:4)

试试这个脚本。它对我有用

$( document ).ready(function() {
    var abc = document.body.innerHTML;
    var a = String(abc).replace(/\u200B/g,'');
    document.body.innerHTML = a;
});

答案 3 :(得分:1)

我可以通过选择周围的字符并将其复制/粘贴到“查找和替换”中来删除Sublime中的这些内容。

答案 4 :(得分:1)

我在一个正在进行的重大项目中遇到过这种情况。

诀窍就是:

  • 将整个代码复制到记事本中。

  • 将其另存为文本文件。

  • 关闭文件。再次打开它并将代码复制回IDE中 环境。

和它的vo,它已经消失了。!

答案 5 :(得分:1)

就我而言,符号Appearance没有出现在代码编辑器MS Code中,并且仅在Elements Chrome选项卡中可见。它帮助删除了出现该符号的标签,并再次手写了该标签的重印,很明显,该符号在传输代码时紧紧按住ctrl + c / ctrl + v。

答案 6 :(得分:1)

此“ 8203;” HTML字符是一个无宽度中断控件。 它可以在 Google Chrome浏览器检查元素部分中轻松找到。而且,当您尝试将其从代码中删除时,大多数Major IDE都不显示给我...(也许是我的喜好)。

我发现新的文本编辑器Brackets已下载并在编辑器中打开代码。它用红点显示字符。只需将其删除,检查一切是否正常。

enter image description here

我从博客中找到了此解决方案。 What is “8203​” HTML character? Why is being injected into my HTML?

谢谢您为我节省了时间。

答案 7 :(得分:-2)

我找不到它在我的页面上被注入的位置。我稍后会对此进行调查,但就目前而言,我只是将其放入我的页面,以便继续工作。

$(function(){
    $('body').contents().eq(0).each(function(){
        if(this.nodeName.toString()=='#text' && this.data.trim().charCodeAt(0)==8203){
            $(this).remove();
        }
    });
});