Вот пример имен файлов:
漢語.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);
}
Я думаю, что это что-то вроде кодирования, но я не знаю, как это сделать.