これは、このStackOverflowの投稿に関連しています。
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++ライブラリは最初に変換を試みます。 youtUTF-8でエンコードされたPHP文字列を実行環境で選択されたローカルの「ANSI」コードページに入力します(コマンドラインからPHP窓)
お使いのバージョンのWindowsは、おそらくこの奇妙なことに責任を負いません。実際、これはあなたのバージョンのPHPであり、正しくコンパイルされておらず、Win32 APIのレガシーANSIバージョンを使用しています(Windows95/98のレガシー16ビットバージョンとの互換性のため)カーネルでのファイルシステムサポートは、実際にはUnicodeを直接サポートしていませんでしたが、APIの実際のANSIバージョンを使用する前に、内部変換レイヤーを使用してUnicodeをローカルANSIコードページに変換しました。
再コンパイルPHPコンパイラオプションを使用して、Win32 APIのUNICODEバージョンを使用します(これは今日のデフォルトであり、とにかく常にデフォルトのPHP Windows95またはWindows98になることのないサーバー...)
これが私の問題かどうかは確認できません。 phpinfo()
を使用しましたが、興味深いものは何も見つかりませんでしたが、何を探すべきかわかりませんでした。簡単にインストールできるように [〜#〜] xampp [〜#〜] を使用しているので、どのようにインストールされたか正確にはわかりません。
私はWindows7、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バージョンでコンパイルされた"かどうかを確認するにはどうすればよいですか?(実際には意味がありますか?)
PHP Windowsリポジトリ から公式バイナリをダウンロードしてインストールする必要があると思います(インストールパスに注意してください)。
その後、デフォルトで実行されているバイナリではなく、新しいバイナリを使用するようにApacheを構成する必要があります。 それは簡単です:
WAMPフォルダ(C:\ wamp\bin\Apache\ApacheXXX\conf\httpd.confなど)でhttpd.conf
ファイルを見つけます。トレイアイコンを通過することも可能です。
わかりました。LoadModule php5_module
に一致する文字列が見つかりました。
この行を、おそらくc:/php/php5Apache2_2.dllにある新しいphp5_module
に置き換えてください(インストールパスを保存しました!)。 LoadModule php5_module "c:/php/php5Apache2_2.dll"
のような結果になります
出来上がり。 Wampサーバーをリセットし、Windows専用の最新バージョンのphpビルドを使用してアプリケーションをテストします。
これで問題が解決するかどうかはわかりませんが、実際の方法は確かです。 PHPの設定に問題がある場合は、これを読んでください 記事 。
幸運を!
この質問はしばらくの間出回っているようで、phpがUnicodeフラグでコンパイルされたかどうかは、Unicodeサポートに影響しませんが、特定のPEイメージがUnicodeバージョンに対してコンパイルされた可能性があるかどうかを判断する必要がある場合Windows APIでは、dumpbin
を使用して、使用されているkernel32.dllインポートを調べることができます。これは私が実際に行うこととはまったく異なりますが、ピンチでは、診断に役立つ可能性があります。
たとえば、Unicode実行可能ファイルは次のようにリストできます。
4C CreateFileMappingW
45 CreateDirectoryW
33 CompareStringW
12E GetCurrentDirectoryW
AF ExpandEnvironmentStringsW
2F0 SetFileAttributesW
wで終わる関数の数に注意してください。Unicode文字の場合はWideとも呼ばれます。
ANSI実行可能ファイルまたはDLLの場合、次のようなものが表示されることがあります。
30A SetCurrentDirectoryA
15E GetFileAttributesA
171 GetLastError
4B CreateDirectoryA
319 SetFileAttributesA
ほとんどの関数がAで終わっているので、実行可能ファイルがANSIフラグでコンパイルされている可能性が高いことがわかります。
これは、私が遭遇したmbstring
問題を処理するために私が取り組んだいくつかのコードです。エンコードとオプションのすべての組み合わせを、そのうちの1つが必要な出力を提示するまで繰り返すことになりました。この種の手順は、あなたが探している答えを見つけるのに役立つかもしれないと私は感じています。
ドキュメントに依存しないでください。私の場合、結果はオプションとエンコーディングが行うと思っていたものではありませんでした。私のテストで、長方形、?s、およびA〜のようなものを取得したことを思い出します。私のテストはあなたとまったく同じでした、print_r
情報。私の場合、私のスクリプトは、UTF-8を処理できないQuickbooksに顧客と販売の情報をインポートしています。 (QB自体ができないか、QODBCドライバーができない)チルダ、墓、およびumlatsは問題外です。
setlocale(LC_CTYPE, 'en_US.UTF-8');
$xmlstr=file_get_contents($file);
// convert character encoding to get rid of accents, etc
// see http://www.php.net/manual/en/function.mb-detect-encoding.php#89915
// note that unlike ASCII//TRANSLIT and ASCII//TRANSLIT//IGNORE do not work
// in windows 7.
$xmlstr=iconv('UTF-8', 'ASCII//IGNORE', $xmlstr);
上記のリンクは http://www.php.net/manual/en/function.mb-detect-encoding.php#89915 であり、Googleがここであなたを見つけた場合は、必ず読んでください。