4

私は次のコードを持っています

<?php
if ($handle = opendir('C:/xampp/htdocs/movies')) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            echo $file."<br />\n";
        }
    }
    closedir($handle);
}
?>

日本語のようなmb言語があると、正しく表示されず、代わりに究極超人あ〜?????〜?のように表示されます。究極超人あ〜る</ p>

とにかく、正しい名前を表示するか、他の人がダウンロードできるようにしますか?

私を助けてくれてありがとう :)

4

6 に答える 6

9

PHP について断言することはできませんが、Python 2 と同じ基本的な問題だと思います (後で Unicode 文字列ファイル名の特別なサポートを追加する前に)。

私の考えでは、PHP は標準 C ライブラリの 'open'-et-al 関数 (バイトベース) を使用してファイル名を処理しています。Windows (NT) では、システム コードページを使用して実際の Unicode ファイル名をエンコードしようとします。これは、西洋のマシンでは cp1252 (ISO-8859-1 に類似) であり、日本のマシンでは cp932 (Shift-JIS に類似) です。システム コードページに存在しない文字については、'?' が表示されます。そのファイルを参照できなくなります。

この問題を回避するには、PHP は Python 3.0 と同じことを行い、ファイル名 (およびその他すべて) に Unicode 文字列を使用し始め、'_wopen'-et-al 関数を使用して、Windows でファイル名へのネイティブ Unicode アクセスを取得する必要があります。これは PHP6 で起こると思いますが、今のところ、おそらくかなり詰め込まれているでしょう。システム コードページを cp932 に変更してファイル名にアクセスすることもできますが、それでも「?」が表示されます。Shift-JIS 以外の他の Unicode 文字の文字をすべて Shift-JIS にする必要はありません。いずれにせよ、アプリケーションの内部文字列をすべて Shift-JIS にするのは非常に恐ろしいエンコーディングです。

ファイルの保存方法を選択する独自のスクリプトである場合は、「4356」などの単純な主キーベースのファイル名をローカルで使用し、実際のファイル名をデータベースに配置し、書き換え/末尾のパス部分を使用してファイルを提供することを強くお勧めしますURL。ユーザーが指定したファイル名を独自のローカル ファイル名に保持することは困難であり、Unicode について心配する必要がなくても、セキュリティ上の問題が発生する可能性があります。

于 2009-03-01T09:36:12.797 に答える
2

@bobince が述べたように、PHP はSystem Localeに指定されたエンコーディングでファイル名を返します。これは、非 Unicode 対応アプリケーションで使用されます。文字が現在のシステム エンコーディングに存在しない場合、ファイル名には「?」が含まれます。アクセスできなくなります。

https://github.com/kenjiuno/php-wfioでインストールphp-wfio.dllを試し、プロトコル経由でファイルを参照できます。wfio://

于 2015-01-29T17:45:52.373 に答える
0

あなたは$file変数への他の 2 つの参照を見逃していましたが、もう少し効率的な方法を発見したかもしれないので、それは良いことです。これを試してください:

<?php
if ($handle = opendir('C:/xampp/htdocs/movies')) {
    while (false !== ($file = readdir($handle))) {
        $file = mb_substr($file, mb_strrpos($file, '/') + 1);
        if ($file != "." && $file != "..") {
            echo $file . "<br />\n";
        }
    }
    closedir($handle);
}
?>
于 2009-01-27T08:49:06.947 に答える
0

ごめん :)

これを試します:

<?php if ($handle = opendir('C:/xampp/htdocs/movies')) { while (false !== ($file = readdir($handle))) { $filename_utf16 = iconv( "iso-8859-1", "utf-16", $file); if ($filename_utf16 != "." && $filename_utf16 != "..") { echo $filename_utf16 . "<br />\n"; } } closedir($handle); } ?>

于 2009-03-01T08:52:13.807 に答える
-1

$fileのインスタンスをmb_substr($file, mb_strrpos($file, '/') + 1) に置き換えれば、準備完了です。マルチバイトエンコーディング用のHuzzah!

于 2009-01-27T06:27:05.127 に答える
-1

Windows はファイル名に UTF-16 を使用していると思います。したがって、内部エンコーディングから出力エンコーディングに変換するmb_convert_encoding関数を試してください。

// convert from UTF-16 to UTF-8
echo mb_convert_encoding($file, 'UTF-8', 'UTF-16');

最初にいくつかの設定を変更する必要がある場合があります (「 」を参照mb_get_info)。

于 2009-01-28T13:42:22.550 に答える