get_contensでファイル名に日本語があると取得できない場合がある

file_get_contentsでファイルを取得できない

Windows + PHP + nginxの環境で、
不定期にWindows共有で奥られてくるファイル一覧の名前を取得して、
中身を開くという処理を行いたかったのですが、
その中でfile_get_contentsで取得できないファイルが存在したのがきっかけでした。
(ファイル名の取得はできているように見えるのにエラーが出たのではまってしまいました。)

結論としては取得するファイル名には日本語は使わないようにすること。

取得できない

実験環境: Windows7(64bit) + PHP5.3

<?php
/*
 * file_get.php
 * dataディレクトリの中のファイル名をfile_get_contentsで取得して中身を出力する
 */

// ディレクトリを開く
$DIR = opendir('data');

// 中のファイルを取得する
while(($file = readdir($DIR)) !== false)
{
    // .と..以外のファイル名を取得してfile_get_contentsで開く
    if ( !('..' === $file || '.' === $file))
    {
        echo $file . ' ' . file_get_contents('data/'.$file) . "\n";
    }
}

実行結果

> php.exe file_get.php
カウント.txt 12345
PHP Warning:  file_get_contents(data/表示回数カウント.txt): failed to open stream: No such file or directory in file_get.php on line 9

Warning: file_get_contents(data/表示回数カウント.txt): failed to open stream: No such file or directory in file_get.php on line 9
表示回数カウント.txt

名前取得できてるじゃんと突っ込みたくなるがWarningが出ていてファイルの中身を表示していない。

日本語ファイル名でも取得できるファイルがある

調べていくと、どうやらファイル名に「表示」の文字があるとファイル取得できないエラーが出ていました。
どこかで聞いたことがあるあの悪名高いSJISのメタ文字のコードを含む日本語名が含まれているとエラーになるようです。

kent-web: 文字化けについて
http://www.kent-web.com/pubc/jcode/

Wikipedia: Shift_JISの2バイト目が5C等になりうることによる問題のところ。
Shift_JIS

おそらく、
・メタ文字コードを含むファイル名をfile_get_contentsで取得したときにエラーが出た
・当たり前のようにWindowsのファイル名はSJIS
・UTF-8等に変換しても大元のファイル名がSJISのメタコードを含む文字のためfile_get_contentsで取得できない