我有一个xhtml页面在xhtml严格的doctype下验证 - 但是,我得到了这个警告,我试图理解 - 并且正确。
但是,我如何找到这个错误的“字节顺序标记”。我正在使用Visual Studio编辑我的文件 - 不确定这是否有帮助。
在UTF-8文件中找到的警告字节顺序标记。
已知UTF-8编码文件中的Unicode字节顺序标记(BOM)会导致某些文本编辑器和旧版浏览器出现问题。在更好地支持之前,您可能需要考虑避免使用它。
答案 0 :(得分:46)
问题的位置部分很简单:byte-order mark(BOM)将位于文件的最开头。
编辑文件时,转到File | Advanced Save Options...
,您会看到“编码”下拉列表(以及“行结尾”下拉列表)。它可能设置为使用“Unicode(带签名的UTF-8) - 代码页65001”。如果向下滚动一下,可以找到“Unicode(UTF-8无签名) - 代码页65001”。应该这样做(如果你愿意)。如警告所示,某些系统可能会被UTF-8文件上的BOM混淆。
另请参阅Unicode站点关于BOM和UTF-8文件的常见问题解答中的this note。除了调用该文件实际上是UTF-8之外,它没有任何功能。特别是,它对字节顺序没有影响(我们有BOM的主要原因),因为UTF-8的字节顺序是固定的。
答案 1 :(得分:21)
以下是我修复此问题的方法:
下载并安装Notepad++
使用Notepad ++
在菜单中选择“编码”并将其设置为“在没有BOM的情况下以UTF-8编码”
保存文件,BOM将消失。
答案 2 :(得分:2)
对于使用Visual Studio的人来说,2018年在Bitbucket上看到了烦人的红点,只需转到Visual Studio的“文件”->“ File.cshtml另存为...”,然后选择“使用编码保存...”:
然后它将弹出一个屏幕,以便您可以更改编码,尝试在列表中一直向下查找,直到看到“ Unicode(UTF-8不带签名)-代码页65001”:
此后,只需覆盖您的文件并将其上传到您的仓库中,BOM就会消失。
希望有帮助。 狮子座。
答案 3 :(得分:0)
在 Linux :
中使用 Geany 打开文件。
在菜单" Dokument "取消选中" 编写Unicode BOM "。
保存文件。
答案 4 :(得分:0)
BOM有时位于INSIDE文本中,而不是在开头 - 如果文件已经使用例如 include_once()通过php从其他文件组装了一段时间。要删除它,请删除BOM前至少一个字符和BOM后至少一个字符之间的区域(以防万一)。 BOM的位置可以位于Internet Explorer的F12开发人员工具中,也可能位于Edge。它被视为黑色菱形/菱形。
Visual Studio和WebMatrix可以保存带或不带签名的文件(在开头)。
BOM会在验证(https://validator.w3.org/#validate_by_upload)或控制台中导致错误 - < / HEAD>当显然存在时,可以将其视为没有< HEAD>的孤儿元素!:
错误:错误结束标记头。
< BODY>作为第二个< BODY>,当只有一个< BODY>时存在,一切都是正确的:
错误:开始标记主体,但已经有相同类型的元素 开。
当BOM或两个BOMS占据第一行而DOCTYPE位于第二行时,可以看到缺少DOCTYPE的整个文档,并显示与此类似的消息:
错误:找到非空格字符时没有首先看到doctype。 预计例如<!DOCTYPE html>。
错误:元素头缺少必需的子元素实例 标题。
错误:Stray doctype。
错误:Stray start tag html。
错误:错误开始标记头。
错误:此时元素元素上不允许使用属性名称。
错误:元元素缺少以下一项或多项 属性:itemprop,property。
错误:此时元素元素上不允许属性http-equiv。
错误:元元素缺少以下一项或多项 属性:itemprop,property。
错误:此时元素元素上不允许使用属性名称。
错误:元元素缺少以下一项或多项 属性:itemprop,property。
错误:元素链接缺少必需的属性属性。
错误:此时元素元素上不允许使用属性名称。
错误:元元素缺少以下一项或多项 属性:itemprop,property。
错误:此时元素元素上不允许使用属性名称。
错误:元元素缺少以下一项或多项 属性:itemprop,property。
错误:此时元素元素上不允许使用属性名称。
错误:元元素缺少以下一项或多项 属性:itemprop,property。
错误:元素标题不允许作为元素主体的子元素 上下文。 (抑制此子树中的更多错误。)
错误:此元素样式不允许作为元素主体的子元素 上下文。 (抑制此子树中的更多错误。)
错误:错误结束标记头。
错误:开始标记主体,但已经有相同类型的元素 开。
致命错误:上次错误后无法恢复。任何进一步的错误将 被忽略了。
(https://validator.w3.org/#validate_by_uri)
IE F12开发人员工具控制台中的消息流:
HTML1527:期望DOCTYPE。请考虑添加有效的HTML5文档类型:“<!DOCTYPE html>”。
HTML1502:意外的DOCTYPE。只允许一个DOCTYPE,它必须在任何元素之前发生。
HTML1513:额外“< html>”找到标签。只有一个“< html>”每个文档都应该存在标记。
HTML1503:意外的开始标记。 HTML1512:无与伦比的结束标记。
一开始由一个BOM引起的一切。调试器在第一行显示一个黑色菱形。
使用签名保存但未由php汇编的文件不会导致此类错误,并且黑色钻石在IE调试器中不可用。所以也许php以某种方式转换BOM。似乎主要的php文件必须用签名保存才能看到。
这些奇怪的字符出现在与include_once()合并的文件的开头和/或边框上,并且在没有签名之前保存文件时不可见。这就是它涉及BOM参与的原因。
我在前一天开始将我的网站转换为HTML5并进行验证时注意到了这一点。
BOM也可以在行的开头创建一个小缩进。两个包含相同文本但一个包含缩进文件的文件。