PHP について断言することはできませんが、Python 2 と同じ基本的な問題だと思います (後で Unicode 文字列ファイル名の特別なサポートを追加する前に)。
私の考えでは、PHP は標準 C ライブラリの 'open'-et-al 関数 (バイトベース) を使用してファイル名を処理しています。Windows (NT) では、システム コードページを使用して実際の Unicode ファイル名をエンコードしようとします。これは、西洋のマシンでは cp1252 (ISO-8859-1 に類似) であり、日本のマシンでは cp932 (Shift-JIS に類似) です。システム コードページに存在しない文字については、'?' が表示されます。そのファイルを参照できなくなります。
この問題を回避するには、PHP は Python 3.0 と同じことを行い、ファイル名 (およびその他すべて) に Unicode 文字列を使用し始め、'_wopen'-et-al 関数を使用して、Windows でファイル名へのネイティブ Unicode アクセスを取得する必要があります。これは PHP6 で起こると思いますが、今のところ、おそらくかなり詰め込まれているでしょう。システム コードページを cp932 に変更してファイル名にアクセスすることもできますが、それでも「?」が表示されます。Shift-JIS 以外の他の Unicode 文字の文字をすべて Shift-JIS にする必要はありません。いずれにせよ、アプリケーションの内部文字列をすべて Shift-JIS にするのは非常に恐ろしいエンコーディングです。
ファイルの保存方法を選択する独自のスクリプトである場合は、「4356」などの単純な主キーベースのファイル名をローカルで使用し、実際のファイル名をデータベースに配置し、書き換え/末尾のパス部分を使用してファイルを提供することを強くお勧めしますURL。ユーザーが指定したファイル名を独自のローカル ファイル名に保持することは困難であり、Unicode について心配する必要がなくても、セキュリティ上の問題が発生する可能性があります。