10

ファイル名の例を次に示します。

漢語.jpg (Chinese)
Федерация.jpg (Russian)
AbÇöişÜĞ.jpg (Turkish, ISO-8859-9)
...

試してみましたが、うまくいきrawurlencode(mb_convert_encoding($file, "UTF-8", mb_detect_encoding($file)))ません。中国語とロシア語の文字はすべて %3F (通常の疑問符) として出力され、トルコ語の文字はすべて削除されます。

Windows、PHP 5.3でテストしています。

私が見つけた唯一の解決策は、エンコーディングを明示的に入力することです。rawurlencode(mb_convert_encoding($file, "UTF-8", "ISO-8859-9"))これはトルコ語の文字に対してのみ機能します。

ちなみに、mb_detect_encoding($file)上記のファイルに対しては常に「UTF-8」を返します。

編集:
次のコードを実行した後mb_convert_encoding()、問題を解決できないと思います:

$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator("mp", FilesystemIterator::UNIX_PATHS));
$iterator = new RegexIterator($iterator, '/^.+\.(gif|jpg|jpeg|png)$/i', RegexIterator::GET_MATCH);

foreach ($iterator as $file)
{
    foreach (mb_list_encodings() as $encoding)
        var_dump(rawurlencode(mb_convert_encoding($file[0], "UTF-8", $encoding)) . " : " . $encoding);
}

これはエンコーディングに関するものだと思いますが、どうすればよいかわかりません。

4

1 に答える 1

1

したがって、主なことは、ほとんどのトランスポート (ネットワーク、ファイル、rpc) が最大で 1 バイトの文字を必要とすることです。URL エンコーディング (%FF) も、入力データが 1 文字あたり 1 バイトであることを想定しています。

したがって、UTF8 を使用する必要があります。マルチバイト文字を取り、それから 1 バイト文字の文字列を作成します。この文字列から、ascii で通常できることを実行できます。

あなたがしたいことは、phpのエンコーディングを明示的に設定することです:

mb_internal_encoding("UTF-8");

これで、内部文字列やファイル名などはすべて UTF-8 (1 バイト) でエンコードされます。ここからファイル名 AS-IS をエコーアウトすると、エンコードされたデータとしてトランスポートにヒットします。JavaScript から、AJAX を使用してリクエストを送信するだけで、すべてが自動的に適切にデコードされ、ブラウザで使用できるようになります:)デフォルトの JS エンコーディングとして使用されます。

<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
于 2012-04-05T19:11:41.587 に答える