Как скачать файл с кириллицей в URL?

Добрый вечер! Пишу небольшой парсер новостей. Возникла проблема со скачиванием файлов с кириллическими символами в url.

Пример:
http://blobproxy-cdn.skoda-auto.com/wwk2-sitecollectionimages/news/march/škoda_на_ралли_акрополис_(2)__201403302311.jpg
http://blobproxy-cdn.skoda-auto.com/wwk2-sitecollectionimages/news/march/в_млада-болеславе_произведено_11_000_000_автомобилей_škoda_201403302311.jpg

Как можно скачать эти файлы? file_get_contents не работает. cUrl. тоже.
  • Вопрос задан
  • 6095 просмотров
Решения вопроса 1
AndruSender
@AndruSender
Привет) Лови решение)
$url = urlencode('http://blobproxy-cdn.skoda-auto.com/wwk2-sitecollectionimages/news/march/в_млада-болеславе_произведено_11_000_000_автомобилей_škoda_201403302311.jpg');
$url = str_replace(array('%3A','%2F'), array(':','/'), $url);
$data = file_get_contents($url);
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@DDanya
Нужно использовать функцию rawurlencode
Ответ написан
FlameStorm
@FlameStorm
Разработчик
В моём случае целевая ссылка имела вид
http://some.domain.org//Uploads/images/408/А,Б%20секция%203%20этаж%204%20квcrop.jpg

т.е. смесь бульдога с носорогом - и слэши лишние, и нелатиница, и пробел в форме %20 .

Помогло следующее решение, по мотивам Andr'U Sender :

if (preg_match('#^([\w\d]+://)([^/]+)(.*)$#iu', $filenameSrc, $m)){
    $filenameSrc = $m[1] . idn_to_ascii($m[2], IDNA_DEFAULT, INTL_IDNA_VARIANT_UTS46) . $m[3];
}
$filenameSrc = urldecode($filenameSrc);
$filenameSrc = rawurlencode($filenameSrc); 
$filenameSrc = str_replace(array('%3A','%2F'), array(':', '/'), $filenameSrc);


Замечу, что если пытаться использовать urlencode, а не rawurlencode, то тот кодирует пробелы в "+" плюсы и ссылка открываться не желала в таком виде. А с %20 как делает rawurlencode - прокатило.

Надеюсь кому-то спасёт немного волос :)

PS:
Добавил ещё кусок кода - первые три строки ввиде блока if {...} (по наводке со стека) для поддержки кириллических (и др. национальных) доменов - теперь и http://сайт.рус/app/img/hero-bg.gif не страшен :)
Ответ написан
Комментировать
@Jook87
Мне помогло такое решение:
$tmpurl=explode("/", $url);
	$url='';
	foreach($tmpurl as $k=>$e):
		if(count($tmpurl)==$k+1):
			$url.=rawurlencode($e);
		else:
			if($k<2)
				$url.=$e."/";
			else
				$url.=rawurlencode($e)."/";
		endif;
	endforeach;

    curl_setopt($ch, CURLOPT_URL, $url);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы