byteordermark:Byte-Order Mark found in UTF-8 File



W3Ccss-validator和UTF-8文档BOM冲突

授权方式:署名非商业用途保持转载时请务必以超链接(http://www.fwolf.com/blog/post/96)形式标明文章原始出处和作者信息及本声明 css-validator是W3C提供个工具用于检查CSS有效性是个不错工具同样还有W3C Markup Validation Service用于检查html、xhtml等文档格式有效性

但是在检查篇文档时候出现了问题文档是UTF-8编码XHTML 1.0 Strict检查已通过CSS代码采用直接使用“<style type=”text/css”>”写在文档中方式在使用css-validator检查时候出现如下:

Target: http://www.fwolf.com/tools/ogame_construction_resource_computer.php

Please, validate your XML document first!

Line 1

Column 1

Content is not allowed in prolog.


行、第列?这不是xml 1.0文档声明么?如何在检查css时候还用这个?结果可能原因有两个:

原因:css-validator架构于Jigsaw——W3C’s Java Server上而Java或Jsp处理XML文档时候无法正确识别UTF-8格式文档BOM从而导致“Content is not allowed in prolog”

原因 2:在这里看到别人在讨论即然XML 1.0规范标准中BOM是合理存在那么相关XML工具就应该具备识别BOM标记功能但css-validator使用XML
Validator是采用ElCel Technology C Toolkit编译而这个东东可能不能完全识别BOM?

在W3Cbugzilla中也有人提交了这个bug但似乎讨论也是无疾而终

由于Windows平台下些编辑器尤其是我使用Emeditor在没有BOM情况下有时会有些麻烦所以出于方便维护来讲我认为BOM还是保留至于css-validator不能识别问题就只能期待css-validator进行改进了目前倒是还可以把css标记粘贴过去进行检查不是?W3CW3C Markup Validation Service在检查文档发现文档具有BOM时候会出现个小提示:

Byte-Order Mark found in UTF-8 File.

The Unicode Byte-Order Mark (BOM) in UTF-8 encoded files is known to cause problems for some text editors and older browsers. You may want to consider avoiding its use until it is better supported.


这介绍说明W3C也在改进各类工具对BOM支持

至于说了半天什么是BOM?请看谈谈Unicode编码简要解释UCS、UTF、BMP、BOM等名词这篇文章还有GonDa’s Blog上Unicode、BOM也提到了

另:css-validator以前都是英文版现在好像改成了自动识别用户语言版本了但是我使用FireFox访问首页居然是乱码--文档是GB2312编码被识别成了UTF-8编码总体感觉易用性比W3C Markup Validation Service差远了尤其是css-validator中文版提示有点莫名其妙还不知道如何才能使用英文版界面






Byte-Order Mark found in UTF-8 File 后面是它些问题,这样后就是文档不能通过你所指示dtd文件校验.
意思是:在以utf-8编码文件出现有BOM标记.
其原因是:
你使用ue打开你这个页面ctrl+h你会看到头两个字节是比较奇怪不是正常ascii码这是utf-8文件文件头用于标示utf-8格式但很不幸很多系统并不认这个标记所以后来似乎utf-8文件有另外种格式就是头两个字节不再是特殊标记了

解决思路方法:
用比较新版本editplus和ultraedit都可以选择保存为无BOMutf-8格式如果用notepad保存似乎定有那个标记





UTF-8 格式編輯程式網頁注意事項 (BOM 困擾)




什麼是 BOM (Byte-Order Mark)?
--------------------
些平台上是把代表數值較大 放在前面這稱為 Big Endian (BE) 系統;有些平台則相反是把代表數值較小 放在前面稱為 Little Endian (LE) 系統

若採 LE 方式編碼BOM 會表示為 0xFF 0xFE而在 Unicode 定義中是不存在 U+FFFE 這個字元.

若採 BE 方式編碼BOM 會表示為 0xFE 0xFF而 U+FEFF 剛好是在 Unicode 中有效字元代表個不佔空間 space 符號所以即使沒被解釋為 BOM也不會對閱覽者產生錯誤訊息.
--------------------

如何移除? (使用 PHP)
引用 http://www.bo-blog.com/index.php?job=art&articleid=a_20040805_214712
-------------------
BOM信息是文件開頭串隱藏用於讓某些編輯器識別這是個UTF-8編碼文件但PHP在讀取文件時會把這些讀出從而形成了文件開頭含有些無法識別問題
要檢測個UTF-8文件是否含有BOM信息就是檢測文件開頭字 3個符是否為0xEF, 0xBB, 0xBF

下方有個小程式使用者可以搜尋某個目錄下所有文件並檢測是否加了BOM

//此文件用於快速測試UTF8編碼文件是不是加了BOM並可自動移除
//By Bob Shen

$basedir=\".\"; //修改此行為需要檢測目錄點表示當前目錄


$auto=1; //是否自動移除發現BOM信息1為是0為否

//以下不用改&#21160;

($dh = opendir($basedir)) {
while (($file = readdir($dh)) ! false) {
($file!=\'.\' && $file!=\'..\' && !is_dir($basedir.\"/\".$file)) echo \"filename: $file \".checkBOM(\"$basedir/$file\").\"
\";
}
closedir($dh);
}

function checkBOM ($filename) {
global $auto;
$contents=file_get_contents($filename);
$char[1]=substr($contents, 0, 1);
$char[2]=substr($contents, 1, 1);
$char[3]=substr($contents, 2, 1);
(ord($char[1])239 && ord($char[2])187 && ord($char[3])191) {
($auto1) {
$rest=substr($contents, 3);
rewrite ($filename, $rest);
(\"BOM found, automatically removed.\");
} {
(\"BOM found.\");
}
}
(\"BOM Not Found.\");
}

function rewrite ($filename, $data) {
$filenum=fopen($filename,\"w\");
flock($filenum,LOCK_EX);
fwrite($filenum,$data);
fclose($filenum);
}
?>
-------------------

2005-11-1 修正

本次測試結果:

1. UltraEdit 10
缺點:商業軟體
優點:完全符合需求

2. EditPlus
缺點:無法移除 BOM 碼借助其他方式移除的後中文變成亂碼商業軟體
優點:可自訂程式語法格式、中文化

2.1 EditPlus 2.20
缺點:商業軟體
優點:完全符合需求

3. PSPad editor
缺點:無法移除 BOM 碼
優點:具有 16 進位編輯模式、中文化.....如果不是要移除 BOM 碼以後我就會改用了

4. Zend Studio Client
缺點:商業軟體、很慢 (測試機器不夠力)
優點:似乎也可以符合需求不過因為太慢了沒有仔細測試過

5. Notepad
缺點:無法移除 BOM 碼
優點:具有摺疊層次功能、可自訂程式語法格式、中文化


Tags:  onyoumark mark是什么意思 cpumark byteordermark

延伸阅读

最新评论

发表评论