PHP文件中的UTF-8 BOM签名

tre*_*nik 22 php byte-order-mark utf-8 character-encoding

我正在编写一些评论过的PHP类,我偶然发现了一个问题.我的名字(对于@author标签)最终得到一个?(这是一个UTF-8字符,......和一个奇怪的名字,我知道).

即使我将文件保存为UTF-8,一些朋友报告说他们看到这个角色完全搞砸了(È™).添加BOM签名会消除此问题.但是这件事让我感到很麻烦,因为我不太了解它,除了我在维基百科上看到的以及其他一些类似的问题.

我知道它在文件的开头添加了一些东西,从我的理解它并没有那么糟糕,但我很担心,因为我读到的唯一有问题的场景涉及PHP文件.因为我正在编写PHP类来共享它们,所以100%兼容比在评论中使用我的名字更重要.

但我试图理解其含义,我应该使用它而不用担心吗?或者是否有可能造成损害的情况?什么时候?

skr*_*bel 24

实际上,BOM是发送到浏览器的实际数据.浏览器会很乐意忽略它,但你仍然无法发送标题.

我相信这个问题确实是你和你朋友的编辑器设置.如果没有BOM,您朋友的编辑器可能无法自动将文件识别为UTF-8.他可以尝试设置他的编辑器,使编辑器期望文件是UTF-8(如果你使用真正的IDE,如NetBeans,那么这甚至可以成为一个项目设置,你可以随代码一起传输) .

另一种方法是尝试一些技巧:一些编辑器尝试使用基于输入文本的一些启发式来确定编码.您可以尝试使用启动每个文件

<?php //Ú?ƒ-8 encoded
Run Code Online (Sandbox Code Playgroud)

也许启发式会得到它.可能有更好的东西放在那里,你可以google什么样的编码检测启发式常见,或只是尝试一些:-)

总而言之,我建议只修复编辑器设置.

哦等等,我误读了最后一部分:为了将代码传播到任何地方,我想你最安全的只是让所有文件只包含较低的7位字符,即纯ASCII,或者只是接受一些有古代编辑的人看到你的名字写得好笑.没有故障安全方式.由于已经发送了标题,因此BOM肯定是糟糕的.另一方面,只要你只在注释中放入UTF-8字符等,一些编辑误解编码的唯一影响就是奇怪的字符.我会正确拼写你的名字并添加针对启发式的评论,这样大多数编辑都会得到它,但总会有人会看到伪造的字符.

  • 浏览器不会忽略BOM.这些错误很难跟踪.永远不要使用BOM保存PHP文件. (4认同)

You*_*nse 13

BOM会导致Headers already sent错误,因此,您无法在PHP文件中使用BOM


oma*_*ena 9

这是一篇旧帖子,已经得到了回答,但我可以给你留下一些我在面对这个BOM问题时找到的资源.

http://people.w3.org/rishida/utils/bomtester/index.php使用此页面可以检查特定文件是否包含BOM.

还有一个方便的脚本,可以在当前目录中输出带有BOM的所有文件.

<?php 
function fopen_utf8 ($filename) { 
    $file = @fopen($filename, "r"); 
    $bom = fread($file, 3); 
    if ($bom != b"\xEF\xBB\xBF") 
    { 
        return false; 
    } 
    else 
    { 
        return true; 
    } 
} 

function file_array($path, $exclude = ".|..|design", $recursive = true) { 
    $path = rtrim($path, "/") . "/"; 
    $folder_handle = opendir($path); 
    $exclude_array = explode("|", $exclude); 
    $result = array(); 
    while(false !== ($filename = readdir($folder_handle))) { 
        if(!in_array(strtolower($filename), $exclude_array)) { 
            if(is_dir($path . $filename . "/")) { 
                                // Need to include full "path" or it's an infinite loop 
                if($recursive) $result[] = file_array($path . $filename . "/", $exclude, true); 
            } else { 
                if ( fopen_utf8($path . $filename) ) 
                { 
                    //$result[] = $filename; 
                    echo ($path . $filename . "<br>"); 
                } 
            } 
        } 
    } 
    return $result; 
} 

$files = file_array("."); 
?>
Run Code Online (Sandbox Code Playgroud)

我在php.net上找到了代码

Dreamweaver也有助于此,它为您提供了保存文件的选项,而不包括BOM内容

这是一个迟到的答案,但我仍然希望它有所帮助.再见


sol*_*arc 7

只是你知道,php中有一个选项zend.multibyte,它允许php用BOM读取文件而不会给出Headers already sent错误.

从php.ini文件:

; If enabled, scripts may be written in encodings that are incompatible with
; the scanner.  CP936, Big5, CP949 and Shift_JIS are the examples of such
; encodings.  To use this feature, mbstring extension must be enabled.
; Default: Off
;zend.multibyte = Off
Run Code Online (Sandbox Code Playgroud)