Немного изучив, я пришел к выводу, что в PHP нет способа хорошо работать (однако другие языки, такие как python / perl, похоже, имеют функции именно для этого варианта использования). Это функция, которую я придумал (обеспечивает кодирование фрагмента пути URL):
function url_path_encode($url) {
$path = parse_url($url, PHP_URL_PATH);
if (strpos($path,'%') !== false) return $url; //avoid double encoding
else {
$encoded_path = array_map('urlencode', explode('/', $path));
return str_replace($path, implode('/', $encoded_path), $url);
}
}