为什么是​&引用;被注入我的HTML?

为什么是&#8203;&引用;被注入我的HTML?,html,encoding,sublimetext2,Html,Encoding,Sublimetext2,编辑:您可以查看问题(在源代码中查找) 编辑2:有趣的是,这不是源代码中的问题。仅使用控制台(Firebug也是) 我在一个名为test.html的文件中有以下标记: ​<!DOCTYPE html> <html> <head> <title>Test Harness</title> <link href='/css/main.css' rel='stylesheet' type='text/css' />

编辑:您可以查看问题(在源代码中查找)

编辑2:有趣的是,这不是源代码中的问题。仅使用控制台(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>

"​
"
测试线束
测试线束
它看起来像是一个零宽度的空间,但是什么导致了它?我正在使用带UTF-8编码的Sublime Text 2和带Jinja2的Google App Engine(但Jinja只是加载
test.html
)。有什么想法吗


提前感谢。

这是源代码中的一个问题。您提供的以以下字节开始(即它们出现在
之前):0xE2 0x80 0x8B。例如,可通过在“显示格式”下选择“十六进制”来使用Rex Swain。还请注意,带有W3C标记验证程序的页面提供的信息表明文档开头有一些非常错误的地方,特别是消息“第1行第1列:未首先看到doctype而找到非空格字符”

验证器和Chrome工具(以及Firebug)中发生的情况是,字节0xE2 0x80 0x8B被视为字符数据,这隐式启动
body
元素(因为字符数据不能有效地显示在
head
元素中或之前),表示前面有一个空的
元素

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

由于页面(在HTTP头中)声明为UTF-8编码,因此这些字节表示(U+200B)字符。它没有可见的标志符号,也没有宽度,因此即使浏览器将其视为
主体
元素开头的数据,您也不会注意到可视化表示中的任何内容。符号
和#8203
是它的一个字符引用,可能被浏览器工具用来指示通常不可见字符的存在


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

我找不到它在我的页面上被注入的位置。我以后会进一步调查,但现在,我只是把这个放在我的页面上,这样我就可以继续工作了

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

我知道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");

});
var元素=[“h1”、“h2”、“h3”、“h4”、“p”、“strong”、“label”、“span”、“a”];
函数targetZWS(){
对于(var i=0;i
我调查过的链接:


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

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

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

    我在一个主要项目中经历过这一点

    诀窍在于:

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

    • 将其另存为文本文件

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


    瞧,它不见了

    在我的例子中,符号
    “​;”
    没有出现在代码编辑器MS code中,仅在选项卡元素中可见。它有助于删除出现此符号后的标记,并再次手写此标记的重印,显然,在传输代码时,此符号紧靠ctrl+c/ctrl+v。

    此“8203;”HTML字符是一个无宽度中断控件。 它可以很容易地在Google Chrome浏览器的“检查元素”部分找到。当您试图从代码中删除它时,大多数主要IDE都没有显示给我…(可能是我的偏好)

    我找到了新的文本编辑器下载它并在编辑器中打开我的代码。它用红点显示字符。拆下它,检查一切是否正常

    我在博客上找到了这个解决方案


    谢谢您为我节省了时间。

    我将您的代码保存为HTML文件,无法复制该问题。我认为您不需要在您的
    标签中添加结束标记
    /
    。尝试删除它,chrome自动为我更正。你能在示例页面上发布一个列表吗?我认为答案无法从上述信息中得出,问题几乎肯定在别处。@Mal,Chrome在解析HTML方面比这聪明得多。但为了确定,我删除了结束语
    /
    ,问题依然存在。@bgp,我在文章顶部添加了一个链接。我同意这可能不是HTML本身;我相当确定这与我的文本编辑器或GAE有关。它真的会像那样重新定位标题行吗?这似乎是正确的。我会怀疑UTF-8字节顺序标记,但这些字节不是这样的。奇怪-肯定还有别的东西