如何修复“在UTF-8文件中找到的字节顺序标记”验证警告

时间:2010-03-31 15:58:14

标签: html css validation

我有一个xhtml页面在xhtml严格的doctype下验证 - 但是,我得到了这个警告,我试图理解 - 并且正确。

但是,我如何找到这个错误的“字节顺序标记”。我正在使用Visual Studio编辑我的文件 - 不确定这是否有帮助。

  

在UTF-8文件中找到的警告字节顺序标记。

     

已知UTF-8编码文件中的Unicode字节顺序标记(BOM)会导致某些文本编辑器和旧版浏览器出现问题。在更好地支持之前,您可能需要考虑避免使用它。

5 个答案:

答案 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)

以下是我修复此问题的方法:

  1. 下载并安装Notepad++

  2. 使用Notepad ++

  3. 打开文件
  4. 在菜单中选择“编码”并将其设置为“在没有BOM的情况下以UTF-8编码”

  5. 保存文件,BOM将消失。

答案 2 :(得分:2)

对于使用Visual Studio的人来说,2018年在Bitbucket上看到了烦人的红点,只需转到Visual Studio的“文件”->“ File.cshtml另存为...”,然后选择“使用编码保存...”:

Save with encoding

然后它将弹出一个屏幕,以便您可以更改编码,尝试在列表中一直向下查找,直到看到“ Unicode(UTF-8不带签名)-代码页65001”:

enter image description here

此后,只需覆盖您的文件并将其上传到您的仓库中,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也可以在行的开头创建一个小缩进。两个包含相同文本但一个包含缩进文件的文件。