私はWindows7のローカルマシンでApache/PHP / MySQLサーバー(xampp)を実行しています。そこにMediaWiki-Softwareと多くの拡張機能をインストールしました。私の目的は、ウィキペディアからいくつかのページをダウンロードして、ローカルに表示することです。1つの大きな問題を除いて、すべてが正常に実行されます。
ドイツ語版ウィキペディアの画像ファイルには、ファイル名にドイツ語ウムラウト(ä、ö、ü)が含まれています。記事はウムラウトの名前にリンクしているため、これを変更することはできません。
これらの画像を(スクリプトを介して)インポートしようとするとmaintenance/importImages.php
、機能しません。コードをトレースして、その理由を理解しました。
PHPがディレクトリをスキャンしてファイルを探すとき、ファイル名をANSI文字列として読み取ります。MediaWikiは内部的にすべての文字列がutf-8であることを要求します。したがって、ファイル名のウムラウトは(存在しない)Unicode文字の一部として解釈され、スクリプトが壊れます。
スクリプトにへの呼び出しを手動で追加するとutf8_encode()
、名前は問題なく、データベースに正しく追加されます。しかし、実際に「images」ディレクトリに書き込まれたファイルの名前は壊れています。ウムラウトの代わりに2つの特殊文字が使用されています。その理由は、PHPスクリプトがutf-8文字列をファイルシステム関数( "copy"、...)に送信しますが、オペレーティングシステムはそこでANSI文字列を想定しているためです。各ファイルシステム呼び出しの前に手動で呼び出しを追加することもできutf8_decode()
ますが、何千もの呼び出しがあります。
簡単に言うと、OSはANSIで動作し(これはWindowsでは簡単に変更できません)、PHPサーバー内のMediaWikiソフトウェアはutf-8で動作します(これも変更できません)。PHPサーバーに出入りするたびにファイル名の文字列を自動的にエンコード/デコードする方法はありますか?
mb_internal_encoding()
私はすでにとで遊んでいましmb_http_output()
たが、これは何も変わりませんでした。MediaWikiは、utf-8文字列でのみ機能するハードコードされた関数を使用します。