【问题标题】:PHP - Read non-latin character dir/file namePHP - 读取非拉丁字符目录/文件名
【发布时间】:2016-11-12 18:53:07
【问题描述】:

我有一些名称中包含非拉丁字符的文件和目录(在 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=

我该怎么办?

附:我最终要实现的目标是,我需要比较两个目录,当我重新读取一个目录的内容时,我无法将其与另一个目录进行比较,因为目录/文件名已损坏-我的脚本名称为01 - ???????? - X,显然找不到这样的第二个(比较)目录中的子目录。

【问题讨论】:

    标签: php file encoding utf-8 filenames


    【解决方案1】:

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

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

    scandir("wfio://directory")
    

    祝你好运!

    【讨论】:

    • 感谢您的回答,但不幸的是它没有帮助 - 结果与上述相同:(
    • 我刚刚提供了一个更新。这可能不是您要寻找的答案
    • 这正是我目前所需要的,谢谢!
    • 顺便说一句,我在 linux VM 中尝试过,它的工作原理就是这样 - 不需要额外的库。再次感谢您在 Windows 方面的帮助!
    猜你喜欢
    • 2022-01-09
    • 2015-06-26
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 2012-11-12
    相关资源
    最近更新 更多