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 には役に立ちません (まだ探しています)。バグの多い「理論的根拠」: 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 に答える