web-dev-qa-db-ja.com

PHPがWin32APIのUNICODEバージョンでコンパイルされているかどうかを確認するにはどうすればよいですか?

これは、この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セクション)のスクリーンショットを次に示します。

phpinfo screen shot

PHPインストールが "Win32 APIのUNICODEバージョンでコンパイルされた"かどうかを確認するにはどうすればよいですか?(実際には意味がありますか?)

10
Wesley Murch

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の設定に問題がある場合は、これを読んでください 記事

幸運を!

3
Thiago Macedo

この質問はしばらくの間出回っているようで、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フラグでコンパイルされている可能性が高いことがわかります。

2
Mitch

これは、私が遭遇した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がここであなたを見つけた場合は、必ず読んでください。

2
Chris K

PHPが mbstring でコンパイルされているかどうか(または、モジュールを使用している場合はmbstringモジュールがインストールされて有効になっている)かどうかを確認する必要があると思います。その拡張機能を有効にすると、問題が解決するはずです。 このページ それを機能させるために知っておく必要のあるすべてのことを教えてくれるはずです。

1
Aaron