Как кодировать многобайтовые имена файлов в PHP и декодировать их в javascript?

Вот пример имен файлов:

漢語.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);
}

Я думаю, что это что-то вроде кодирования, но я не знаю, как это сделать.

Ответ 1

Итак, главное, что большинство транспортов (сеть, файлы, rpc) будут нуждаться в символах, которые больше не являются байтами. Кодировка URL (% FF) ожидает, что входные данные также будут байтом на символ.

Итак, вам нужно использовать UTF8. Это займет многобайтовые символы и выведет из него строку из 1 байтового символа. Из этой строки вы можете делать то, что обычно может делать ascii.

Что вы хотите сделать, это явно установить кодировку для php:

mb_internal_encoding("UTF-8");

Теперь все ваши внутренние строки и имена файлов и т.д. будут кодироваться в кодировке UTF-8 (один байт). Отсюда вы можете отозвать имя файла AS-IS, и оно попадет в транспорт в виде закодированных данных. Из javascript все, что вам нужно сделать, это отправить запрос с помощью AJAX, и все это будет автоматически декодировано для вас автоматически, готово к использованию в браузере. Просто убедитесь, что вы установили свой тип контента в свой html файл, так как это будет использоваться как ваша JS-кодировка по умолчанию.

<meta http-equiv="Content-Type" content="text/html; charset=utf-8″ />