4

我正在使用 Windows 2003 编写一些 PHP 代码。我使用 XAMPP Portable(复制到 D:)。问题:

$path = 'D:\ebooks';
$all_file = scandir($path);
foreach ($all_file as $file) {
  if (is_dir("$path/$file") && $file != '.' && $file != '..') {
    echo $file . "<br />\n";
  }
}

当我调用脚本(使用浏览器)时,我没有看到任何包含 Unicode 字符的目录(在 D:\ebooks 中)(我用越南语、日语、中文、捷克语进行了测试)。

但如果我删除is_dir("$path/$file"),目录显示有许多奇怪的字符和许多???字符。

我该如何解决这个问题?

4

2 回答 2

6

不幸的是,有很多与 PHP 访问 Windows 文件系统相关的错误。虽然 Windows 确实将文件名存储为 UTF-16,但 PHP 的内部使用更旧的 ANSI api。所以最好只使用 ascii 范围内的文件名,或者切换到不同的操作系统。

于 2012-04-04T09:32:56.130 回答
0

这可能对捷克语有帮助,对 CJK 没有帮助(我自己还在寻找那个)。Buggy“基本原理”:UTF-8 是可以的,只要它可以映射到 windows 字符集。

PHP对此非常清楚:

scandir() 和 readdir() 不支持 Unicode 文件名

http://bugs.php.net/bug.php?id=34574

«PHP 在 PHP6 之前不支持 unicode 操作。»

写于 2005 年 9 月。

您还可以尝试使用 system('dir /X') 获取等效的 dos 短名称,解析短名称和长名称的结果并从那里开始工作。显示长名称,使用短名称实际访问(当然用于统计、时间戳和文件打开)...

于 2012-05-08T12:31:24.753 回答