我有一个网站,它的 PHP 将所有其他文件收集在与当前脚本相同的目录中,并由此生成一个菜单(此菜单包括运行脚本的当前文件)。
当我从这个文件名列表生成这个菜单的 HTML 时,我检查每个文件名是否等于当前文件的名称(通过 __ FILE __)。如果是这样,我会应用一种样式来突出显示菜单中的该项目。
我的文件名带有法语口音,因为文件名也用于页面标题。这在 Chrome 和 Firefox 中运行良好,但 Safari 和 IOS 不起作用;法语口音在某个地方搞砸了这个过程,因为从我的文件名中删除法语口音可以解决问题。
这是我的代码:
从当前目录获取所有相关文件
if ($handle = opendir(getcwd())) {
$albums = array();
while (false !== ($entry = readdir($handle))) {
if(is_numeric(substr($entry, 0, 4))) array_push($albums, $entry);
}
closedir($handle);
}
这是我的字符串比较,简化了,它们的 var_dumps:(未添加文件名清理,假设两个 var 都给出了名称文件名结构)
for($i=0; $i < count($albums); $i++){
echo var_dump($albums[$i]); echo var_dump(basename(__FILE__));
}
及其产生的回声:
string(26) "2010_Kalymnos,_Grèce.php"
string(25) "2010_Kalymnos,_Grèce.php"
当我尝试强制使用 UTF_8 或 ASCII 来查看他们如何处理法语口音时,他们会以不同的方式转换口音,但我不知道是什么原因造成的。是我用来获取文件的方法吗(__ FILE __, readdir())?
我的 HTML 文件是 utf-8,以防这很重要。将我的 PHP 专门设置为 UTF-8 也不能解决问题。
编辑
<?php echo bin2hex($albums[$i]); echo '<br/>'.bin2hex($originFilename);?>
结果是:
323031305f4b616c796d6e6f732c5f477265cc8063652e706870
323031305f4b616c796d6e6f732c5f4772c3a863652e706870
两者中,第一个十六进制字符串是正确的。