Декодирование URL в PHP - PullRequest
32 голосов
/ 18 ноября 2009

Я пытаюсь декодировать эту строку URL с помощью функции urldecode PHP:

urldecode("Ant%C3%B4nio+Carlos+Jobim");

Это должно быть выведено ...

'Antônio Carlos Jobim'

... но вместо этого отключает это

'Antônio Carlos Jobim'

Я проверил строку в онлайн-декодере на основе JS с большим успехом, но не могу выполнить эту операцию на стороне сервера. Есть идеи?

Ответы [ 6 ]

62 голосов
/ 18 ноября 2009

Ваша строка также в кодировке UTF-8. Это будет работать:

echo utf8_decode(urldecode("Ant%C3%B4nio+Carlos+Jobim"));

Вывод: «Антониу Карлос Жобим».

13 голосов
/ 18 ноября 2009

На самом деле вы получаете желаемый результат, но он не интерпретируется как UTF-8. Если это в приложении HTTP, вы должны отправить заголовок или метатег (или оба), которые скажут клиенту использовать UTF-8.

Редактировать: например:

// replace text/html with the content type you're using
header('Content-Type: text/html; charset=UTF-8');
2 голосов
/ 18 ноября 2009

когда я делаю

<?php
echo urldecode("Ant%C3%B4nio+Carlos+Jobim");
?>

Отображается правильно в моем браузере, как

Антонио Карлос Хобим

Я тестировал с XAMPP

1 голос
/ 18 ноября 2009

Используете ли вы также htmlenteties перед отправкой на страницу? Когда я только что протестировал ваш код, он работал нормально только с частью urldecode("Ant%C3%B4nio+Carlos+Jobim");, но когда я прогнал его через htmlentities, я получил тот же вывод, что и вы.

Кажется, проблема в символах UTF-8 и в том, как PHP обрабатывает функцию htmlentities.

0 голосов
/ 03 января 2019

сначала вы должны декодировать в функции urldecoder "urldecoder ()", а затем использовать Функция декодера utf "utf_decoder ()"

0 голосов
/ 26 марта 2013

другой вариант:

<?php
$smthing = 'http%3A%2F%2Fmysite.com';
$smthing = preg_replace("/%u([0-9a-f]{3,4})/i","&#x\\1;",urldecode($smthing)); 
$smthing = html_entity_decode($smthing,null,'UTF-8');
echo $smthing;
?>

вывод становится: http://mysite.com

...