파일의 houndreds가있는 PHP 응용 프로그램이 있습니다. 문제는 하나 또는 여러 개의 파일에 BOM이있는 것입니다. 따라서 세션을 만들 때 오류가 발생하면 PHP 또는 서버를 재구성하는 방법이 있습니까? 아니면 BOM을 제거 할 수 있습니까? 또는 최소한 소스를 식별 할 수 있습니까? 나는 정력 내부에 한 번바이트 순서 세션 오류를 일으키는 표시
0
A
답변
0
이 스크립트를 사용하여 BOM을 포함하고있는 파일을 식별 할 수 있었고 나중에 같은 문제가있는 다른 사용자에게 도움이 될 수도 있습니다. eval()
없이 작동합니다.
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 = ".|..|libraries", $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(".");
-1
vim $(find . -name \*.php)
경우 사용할 수있는 PHP 솔루션을 선호하는 것 :
물론 실제 솔루션 파일을 저장하지 (뿐만 아니라 다른 팀 멤버) 편집기 설정을 수정하는 것입니다:argdo :set nobomb | :w
1
UTF 바이트 순서 표시. 읽기 : https://stackoverflow.com/a/2558793/43959
이 기능을 사용하면 다른 PHP 파일을 포함하기 전에 BOM을 "투명하게"제거 할 수 있습니다.
참고 : 여기서 설명하는 eval()
으로 불쾌한 일을하는 대신 편집자/파일을 수정하는 것이 좋습니다.
이 개념의 단지 증거입니다 :
bom_test.php : 처음에 BOM과
<?php
function bom_safe_include($file) {
$fd = fopen($file, "r");
// read 3 bytes to detect BOM. file read pointer is now behind BOM
$possible_bom = fread($fd, 3);
// if the file has no BOM, reset pointer to beginning file (0)
if ($possible_bom !== "\xEF\xBB\xBF") {
fseek($fd, 0);
}
$content = stream_get_contents($fd);
fclose($fd);
// execute (partial) script (without BOM) using eval
eval ("?>$content");
// export global vars
$GLOBALS += get_defined_vars();
}
// include a file
bom_safe_include("test_include.php");
// test function and variable from include
test_function($test);
test_include.php,
test
<?php
$test = "Hello World!";
function test_function ($text) {
echo $text, PHP_EOL;
}
출력 :
[email protected]$ php bom_test.php
test
Hello World!
+0
시도 할 것입니다 ... 그러나, 내 편집자가 올바르게 구성되어 있습니다, 누군가 elses 아니었다 .... – Michal
어떻게 파일을 만들었습니까? –
http://stackoverflow.com/questions/204765/elegant-way-to-search-for-utf-8-files-with-bom –
은 어떻게 생성되었는지에 차이가 없습니다 ... @anders lindahl 그것은 쉘 스크립트입니다. , 나는 그것을 사용할 수 없습니다 ... – Michal