PHP - 读取非拉丁字符目录/文件名

时间:2016-07-10 21:15:36

标签: php file encoding utf-8 filenames

我有一些文件和目录(在Windows上,但最终我将在Mac和Linux上运行相同的脚本),名称中包含非拉丁字符,例如:

目录名01 - Проверка - X

我正在尝试阅读该名称并打印但未成功 - 我总是得到01 - ???????? - X

我尝试了什么:

$items = scandir('c:/myDir/');
$name = $items[2];

echo mb_detect_encoding($name); // Returns "ASCII"
echo '<br>';

echo $n = mb_convert_encoding($name, 'UTF-8', 'Windows-1252');
echo '<br>';
echo base64_encode($n);
echo '<br><br>';

echo $n = mb_convert_encoding($name, 'UTF-8', 'ISO-8859-1');
echo '<br>';
echo base64_encode($n);
echo '<br><br>';

echo $n = mb_convert_encoding($name, 'UTF-8', 'ISO-8859-15');
echo '<br>';
echo base64_encode($n);
echo '<br><br>';

echo $n = mb_convert_encoding($name, 'Windows-1252', 'UTF-8');
echo '<br>';
echo base64_encode($n);
echo '<br><br>';

echo $n = mb_convert_encoding($name, 'ISO-8859-1', 'UTF-8');
echo '<br>';
echo base64_encode($n);
echo '<br><br>';

echo $n = mb_convert_encoding($name, 'ISO-8859-15', 'UTF-8');
echo '<br>';
echo base64_encode($n);
echo '<br><br>';

echo $n = iconv('WINDOWS-1252', 'UTF-8', $name);
echo '<br>';
echo base64_encode($n);
echo '<br><br>';

echo $n = iconv('ISO-8859-1',   'UTF-8', $name);
echo '<br>';
echo base64_encode($n);
echo '<br><br>';

echo $n = iconv('ISO-8859-15',  'UTF-8', $name);
echo '<br>';
echo base64_encode($n);
echo '<br><br>';

echo $n = iconv('UTF-8', 'WINDOWS-1252', $name);
echo '<br>';
echo base64_encode($n);
echo '<br><br>';

echo $n = iconv('UTF-8', 'ISO-8859-1', $name);
echo '<br>';
echo base64_encode($n);
echo '<br><br>';

echo $n = iconv('UTF-8', 'ISO-8859-15', $name);
echo '<br>';
echo base64_encode($n);
echo '<br><br>';

在结果中我总是有相同的行(我用base64编码,你可以看到它是同一行)

ASCII
01 - ???????? - X
MDEgLSA/Pz8/Pz8/PyAtIFg=

01 - ???????? - X
MDEgLSA/Pz8/Pz8/PyAtIFg=

01 - ???????? - X
MDEgLSA/Pz8/Pz8/PyAtIFg=

01 - ???????? - X
MDEgLSA/Pz8/Pz8/PyAtIFg=

01 - ???????? - X
MDEgLSA/Pz8/Pz8/PyAtIFg=

01 - ???????? - X
MDEgLSA/Pz8/Pz8/PyAtIFg=

01 - ???????? - X
MDEgLSA/Pz8/Pz8/PyAtIFg=

01 - ???????? - X
MDEgLSA/Pz8/Pz8/PyAtIFg=

01 - ???????? - X
MDEgLSA/Pz8/Pz8/PyAtIFg=

01 - ???????? - X
MDEgLSA/Pz8/Pz8/PyAtIFg=

01 - ???????? - X
MDEgLSA/Pz8/Pz8/PyAtIFg=

01 - ???????? - X
MDEgLSA/Pz8/Pz8/PyAtIFg=

我该怎么办?

P.S。我最终想要实现的目标,我需要比较两个目录,当我reed一个目录的内容时,我无法将它与另一个目录进行比较,因为目录/文件名被破坏 - 我的脚本名称为01 - ???????? - X,显然不能在第二个(比较)目录中找到这样的子目录。

1 个答案:

答案 0 :(得分:2)

其实我以前的答案不对。问题是PHP5不支持UTF-8进行文件操作。

解决方法是使用像WFIO这样的东西,它公开了它自己的文件流协议,并允许PHP在文件操作中处理UTF-8字符。您可以在README中看到语法是:

scandir("wfio://directory")
祝你好运!