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


10

これは、このスタックオーバーフローの投稿に関連しています。

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

phpinfoスクリーンショット

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


5
ウェスリーはお互いに気をつけなければならないので賛成です。
ウェズリー

エンコーディングに関してスクリプトで何かしましたか?私はwin7-64インストールでこの問題の反対をしました!Phpはumlatsなどすべて、そして私がコミュニケーションをとっていたがらくたなレガシープログラムを、それが得られたときに休憩で読みます。
Chris K

この質問に答えて申し訳ありませんが、私が望んでいた迅速で汚い作業の答えが得られなかったため、最終的にWindowsでのこのプロジェクトの開発を中止しました。私はPHP 5.4をローカルに(Windowsで)すぐにインストールするので、誰かが受け入れられた答えを提案したい場合、この質問はもはや私にとって価値がないかもしれません。それまでの間、賛成票と感謝を込めて。
ウェズリー・マーチ

回答:


3

PHP Windowsリポジトリから公式バイナリをダウンロードしてインストールする必要があると思います(インストールパスに注意してください)。

その後、デフォルトで保持されているバイナリではなく、新しいバイナリを使用するようにApacheを設定する必要があります。それは単純だ:

  • httpd.confWAMPフォルダー(C:\ wamp \ bin \ apache \ ApacheXXX \ conf \ httpd.confのようなもの)でファイルを見つけます。トレイアイコンを使用することもできます。

  • さて、あなたはそれが一致する文字列を見つけたので LoadModule php5_module

  • この行をphp5_module、c:/php/php5apache2_2.dllにある新しい行に置き換えてください(インストールパスを保存しました!)。次のような結果になりますLoadModule php5_module "c:/php/php5apache2_2.dll"

出来上がり。wampサーバーをリセットし、Windows専用の最新バージョンのphpビルドでアプリケーションをテストします。

これで問題が解決するかどうかはわかりませんが、実際の解決策です。PHPの設定に問題がある場合は、こちらの記事をお読みください

幸運を!


2

この質問はしばらく出てきたようで、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

これはmbstring私が遭遇した問題を処理するために私が取り組んだいくつかのコードです。最終的に、エンコーディングとオプションのすべての組み合わせを繰り返し処理し、そのうちの1つが必要な出力を表示するようにしました。この種の手順は、あなたが探している答えを見つけるのに役立つかもしれないと感じています。

私の場合のように、ドキュメント依存しないでください。結果は、オプションとエンコーディングが行うだろうと私が思ったものではありませんでした。私のテストでは、四角形、?、およびA〜などが表示されることを思い出しました。私のテストはあなたのものと全く同じでしたprint_r、情報。私の場合、スクリプトは顧客情報と販売情報を、UTF-8を処理できないQuickbooksにインポートしています。(QB自体ができないか、QODBCドライバーができない)ティルダ、墓、ウムラットは問題外です。

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がここで見つけた場合は、必ず読んでください。


1

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


提案ありがとうございますが、mbstringは正しくインストールされていると思います。これに関する小さな情報を投稿の最後に追加しました。「正しくコンパイルされておらず、Win32 APIのレガシーANSIバージョンを使用しているPHPのYOURバージョン」という記事から引用したコメント、これが当てはまるかどうかを確認する方法、およびこれが関連するかどうか。
ウェズリー・マーチ

PHPでのUnicodeサポートは、PHPがビジネスを行うために使用するAPIでのUnicodeサポートとあまり関係がないと思います。前者ではなく後者が問題だと思います。(ただし、問題に対する回答はありません。まともな言語を試した後のPHPの完全なひどさにうんざりしているので、あまり経験がありません)。
12
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.