В качестве примера возьмем следующую страницу блога:
http://www.roney.com.br/2010/06/20/estados-do-brasil-um-pais-que-precisa-se-unir/
! Осторожно, в него встроено множество YouTube, поэтому загрузка идет медленно! Это бразильская веб-страница, написанная на португальском языке, но размещенная (по словам владельца блога) на веб-хостинге в США.
Интересны ссылки «Pronúncia», где они указывают на имена файлов, содержащие символы не ascii. Взгляните на второй (для Пара): я пишу ссылку на www.roney.com.br/wp-content/uploads/2010/06/par%E1.mp3 (если он не изменит ее из-под меня в будущее :)!))
Как вы видите, он его закодировал, но вы не знаете, как он на самом деле назвал его в своей файловой системе или какая у них конфигурация системы.
Если я щелкну по нему в браузере Firefox, я получу их страницу 404. Он утверждает, что эти ссылки работают для посетителей из Бразилии. Я думал, что это 100% серверная вещь, т.е. либо сервер будет обслуживать его, либо нет. Просто для смеха я установил в своем Firefox предпочтительный язык на португальский, но, как я и подозревал, это не имело никакого значения.
Любой желающий может предложить какое-либо представление о том, как это может работать в Бразилии, но не в США, или о том, что я бы настроил на своей собственной рабочей станции, чтобы они тоже служили мне.
Проблема заключается в кодировке URI. Здесь он кодируется как iso-8859-1 (latin-1) (а затем закодирован в процентах), но RFC 3986 заявляет, что он должен быть закодирован как UTF-8 (а затем закодирован в процентах).
Источник:
Подробнее о процентное кодирование в Википедии.
Настоящий RFC 3986.
Решение:
Чтобы дать вам представление о том, как решить эту проблему, вы можете сделать что-то подобное в PHP.
<?php
echo urlencode(utf8_encode(urldecode('par%E1.mp3')));
?>
Обратите внимание, что если вы поместите весь URI, косые черты (/) также будут закодированы, что сделает URI недействительным.