Как кодировать многобайтовые имена файлов в 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″ />