« 实用的存储过程2Access数据库过大问题的几种解决方案 »

Byte-Order Mark found in UTF-8 File

选择三篇代表性的文字说明这个问题,希望可以解决您的疑惑。


 

W3C的css-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”。

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

在W3C的bugzilla中也有人提交了这个bug,但似乎讨论也是无疾而终。

由于Windows平台下的一些编辑器,尤其是我使用的Emeditor,在没有BOM的情况下,有时会有些麻烦,所以出于方便维护的目的来讲,我认为BOM还是保留的好。至于css-validator不能识别的问题,就只能期待css-validator进行改进了,目前倒是还可以把css标记粘贴过去进行检查不是?W3C的W3C 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都可以选择保存为无BOM的utf-8格式。如果用notepad保存,似乎一定有那个标记。

 



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

 

什麼是 BOM (Byte-Order Mark)?
--------------------
在一些平台上,是把代表數值較大的 byte 放在前面,這稱為 Big Endian (BE) 的系統;有些平台則相反,是把代表數值較小的 byte 放在前面,稱為 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信息,就是檢測文件開頭的字三個符,是否為0xEF, 0xBB, 0xBF。

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

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

$basedir="."; //修改此行為需要檢測的目錄,點表示當前目錄
$auto=1; //是否自動移除發現的BOM信息。1為是,0為否。

//以下不用改&#21160;

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

function checkBOM ($filename) {
global $auto;
$contents=file_get_contents($filename);
$charset[1]=substr($contents, 0, 1);
$charset[2]=substr($contents, 1, 1);
$charset[3]=substr($contents, 2, 1);
if (ord($charset[1])==239 && ord($charset[2])==187 && ord($charset[3])==191) {
if ($auto==1) {
$rest=substr($contents, 3);
rewrite ($filename, $rest);
return ("BOM found, automatically removed.");
} else {
return ("BOM found.");
}
}
else return ("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 碼。
優點:具有摺疊層次功能、可自訂程式語法格式、中文化。



 

原创文章如转载,请注明:转载自悠悠博客 [ http://www.ajaxstu.com/ ]

相关文章:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。