【问题标题】:List directories containing Unicode characters on Windows在 Windows 上列出包含 Unicode 字符的目录
【发布时间】:2012-04-17 23:55:47
【问题描述】:

我正在使用 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"),目录会显示许多奇怪的字符和许多 ??? 字符。

我该如何解决这个问题?

【问题讨论】:

  • “unicode 名称”是什么意思?你的意思是像Ô或ü这样的特殊字符?
  • “许多奇怪的字符”部分可能与您对浏览器输出的编码有关。

标签: php windows unicode directory


【解决方案1】:

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

PHP 对此非常清楚:

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

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

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

写于 2005 年 9 月。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • @cbuckley:通常我不鼓励人们这么说,但在这种情况下,Windows 上的 PHP 对文件系统的支持真的很糟糕。
    • 我在 linux php 7.1 中遇到了这个问题。请查看链接:bugs.php.net/bug.php?id=74958
    猜你喜欢
    • 2020-05-06
    • 2011-01-28
    • 2016-02-11
    • 2020-12-19
    • 2020-11-23
    • 2021-04-30
    • 2019-01-29
    • 2016-09-26
    • 1970-01-01
    相关资源
    最近更新 更多