これは、このスタックオーバーフローの投稿に関連しています。
glob()はWindowsでマルチバイト文字を含むファイル名を見つけることができませんか?
PHPとWindowsでマルチバイト文字を含むファイルに問題があります。これが私のテストケースです:
print_r(scandir('./uploads/'));
print_r(glob('./uploads/*'));
リモートUNIXサーバーでの正しい出力:
Array
(
[0] => .
[1] => ..
[2] => filename-äöü.jpg
[3] => filename.jpg
[4] => test이test.jpg
[5] => имя файла.jpg
[6] => פילענאַמע.jpg
[7] => 文件名.jpg
)
Array
(
[0] => ./uploads/filename-äöü.jpg
[1] => ./uploads/filename.jpg
[2] => ./uploads/test이test.jpg
[3] => ./uploads/имя файла.jpg
[4] => ./uploads/פילענאַמע.jpg
[5] => ./uploads/文件名.jpg
)
Windowsのローカルでの誤った出力:
Array
(
[0] => .
[1] => ..
[2] => ??? ?????.jpg
[3] => ???.jpg
[4] => ?????????.jpg
[5] => filename-äöü.jpg
[6] => filename.jpg
[7] => test?test.jpg
)
Array
(
[0] => ./uploads/filename-äöü.jpg
[1] => ./uploads/filename.jpg
)
これは、私が受け入れることを選択した回答からの関連する抜粋です(実際には、2年以上前にオンラインで投稿された記事からの引用です)。
この記事のコメントから:http : //www.rooftopsolutions.nl/blog/filesystem-encoding-and-php
Windows上のPHPインストールからの出力は簡単に説明できます。間違ったバージョンのPHPをインストールし、Win32 APIのUnicodeバージョンを使用するようにコンパイルされていないバージョンを使用しました。このため、PHPで使用されるファイルシステムコールはレガシーの「ANSI」APIを使用するため、このバージョンのPHPにリンクされたC / C ++ライブラリは、まずUTF-8でエンコードされたPHP文字列をローカルの「ANSI」に変換しようとします実行中の環境で選択されたコードページ(コマンドラインウィンドウからPHPを起動する前にCHCPコマンドを参照してください)
お使いのバージョンのWindowsは、おそらくこの奇妙なことの原因ではありません。実際、これは正しくコンパイルされていないあなたのバージョンのPHPであり、Win32 APIのレガシーANSIバージョンを使用します(カーネルのファイルシステムサポートに実際に直接対応していないレガシー16ビットバージョンのWindows 95/98との互換性のため) Unicodeのサポート。ただし、APIの実際のANSIバージョンを使用する前に、内部変換層を使用してUnicodeをローカルANSIコードページに変換しました。
コンパイラオプションを使用してPHPを再コンパイルし、UNICODEバージョンのWin32 APIを使用します(これは現在のデフォルトであり、Windows 95またはWindows 98になることのないサーバーにインストールされたPHPのデフォルトです。)
これが私の問題かどうか確認できません。phpinfo()
使ってみて何も面白いとは思いませんでしたが、何を探したらいいのかわかりませんでした。私は簡単なインストールのためにXAMPPを使用してきたので、それがどのようにインストールされたか正確にはわかりません。
私はWindows 7、64ビットを使用しています-私の無知は許しますが、ここで「Win32」が関連しているかどうかさえわかりません。PHPの現在のバージョンが上記の構成でコンパイルされているかどうかを確認するにはどうすればよいですか?
- PHPバージョン:5.3.8
- システム:Windows NT WES-PC 6.1ビルド7601(Windows 7 Home Premium Edition Service Pack 1)i586
- ビルド日:2011年8月23日11:47:20
- コンパイラ:MSVC9(Visual C ++ 2008)
- アーキテクチャ:x86
- 設定コマンド:
cscript /nologo configure.js "--enable-snapshot-build" "--disable-isapi" "--enable-debug-pack" "--disable-isapi" "--without-mssql" "--without-pdo-mssql" "--without-pi3web" "--with-pdo-oci=D:\php-sdk\oracle\instantclient10\sdk,shared" "--with-oci8=D:\php-sdk\oracle\instantclient10\sdk,shared" "--with-oci8-11g=D:\php-sdk\oracle\instantclient11\sdk,shared" "--enable-object-out-dir=../obj/" "--enable-com-dotnet" "--with-mcrypt=static" "--disable-static-analyze"
関連性がある場合、または有用な情報が明らかになった場合のために、私のphpinfo()
(mbstringセクション)のスクリーンショットを次に示します。
PHPのインストールが「Win32 APIのUNICODEバージョンでコンパイルされている」かどうかを確認するにはどうすればよいですか?(そして、それは実際に意味がありますか?)