1

私は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文字列でのみ機能するハードコードされた関数を使用します。

4

1 に答える 1

1

インポートする前に、ファイルシステム上のすべてのファイルの名前を変更して、データベース内のデータと一致させる必要があります。

ファイル名のUTF-8エンコードされたバイナリシーケンスがファイルシステムにヒットしたときに、ファイルが見つかることを確認してください。

$fileANSI; // you have this
$fileUTF8 = ut8_encode($fileANSI); // you do this already
// insert etc, when MW is ready do:
rename($fileANSI, $fileUTF8);

したがって、ヒットしたときに、各ファイルの名前を現在の名前からバイナリシーケンスに変更する必要があります。

ウェブサーバーでは、PHP自体以外のファイルシステム処理を使用する可能性があるため、着信HTTPリクエストを処理するための書き換えルールを導入する必要がある場合もあります。

また、使用されているコードページのファイルシステムのシステム構成も確認してください。それは異なる場合があります。

于 2012-12-28T14:17:56.997 に答える