我正在使用这些代码和类似的东西解析文件...
if ($dataLines[0] == "0 HEAD" &&
($dataLines[count($dataLines) - 1] == "0 TRLR" ||
$dataLines[count($dataLines) - 2] == "0 TRLR")) {
// More Code Here
}
我已经为调试添加了以下内容...
} else {
$this->error("import(): File is not a gedcom datafile: " . $filename);
$this->debug("import(): Lines: " . count($dataLines));
$this->debug("import(): Lines: dataLines[0] = [" . $dataLines[0] ."]");
$this->debug("import(): Lines: dataLines[count($dataLines) - 1] = [" . $dataLines[count($dataLines) - 1] ."]");
}
当我解析ANSII文件时,工作正常。我已经获得了一个UTF-8文件,事情就破了。我的输出是:
Starting gedcom read
import(): File is not a gedcom datafile: /Users/jzaun/Development/www/assets/trees/greek/tree.ged
import(): Lines: 10712
import(): Lines: dataLines[0] = [0 HEAD ]
我也遇到了错误:
PHP致命错误:/Users/jzaun/Development/www/classes/App/Gedcom.php:478中带有消息'数组到字符串转换'的未捕获异常'ErrorException' 堆栈跟踪:
加载我正在使用的文件:
function file_get_contents_utf8($fn) {
$content = file_get_contents($fn);
return mb_convert_encoding($content, 'UTF-8', mb_detect_encoding($content));
}
$data = $this->file_get_contents_utf8($filename);
$dataLines = explode("\n", trim($data));
if (count($dataLines) == 1) {
$dataLines = explode("\r", trim($data));
}
我猜我要么加载文件错误,要么我不应该做$dataLines[0] == "0 HEAD"
之类的事情。我应该如何解析文件,以便与UTF-8一起使用?
答案 0 :(得分:1)
这个

是Byte Order Mark (BOM)。它可能是您的问题,因为它改变了第一行并且您的比较失败。
如果它们等于
,则必须忽略/删除前三个字节。有关示例,请参阅this answer。