кодирование URL ведет себя по-разному в Firefox и Internet Explorer - PullRequest
1 голос
/ 30 ноября 2011

Я хочу отправить запись пользователя в API геокодирования Google. При этом я обнаружил проблему. Когда я отправляю пользовательский ввод (например, "köln + Germany") через мой скрипт в API в Firefox, он прекрасно работает. Однако в Internet Explorer это не работает.

Вот освобождение моего кода, которого достаточно, чтобы показать проблему:

header('Content-type: text/html; charset=UTF-8');
header('Cache-Control: no-cache, must-revalidate');
$loc = urlencode($_GET['loc']);
echo $address = "http://maps.googleapis.com/maps/api/geocode/json?address=$loc&sensor=false";

Вывод ($ address) в Firefox: http://maps.googleapis.com/maps/api/geocode/json?address=k%C3%B6ln+Germany&sensor=false (работает!)

То же в Internet Explorer: http://maps.googleapis.com/maps/api/geocode/json?address=k%F6ln+Germany&sensor=false (возвращает "INVALID_REQUEST")

Вы можете увидеть разницу в кодировке ö. В Firefox это% C3% B6, в IE это k% F6. Если для начала я введу пользовательский ввод "k% C3% B6ln + Germany", то в Internet Explorer он тоже будет работать как шарм.

Как с помощью PHP обеспечить, чтобы преобразование моих специальных символов в Internet Explorer было таким же, как и в Firefox. Итак, ö =% C3% B6 вместо ö = k% F6

Большое спасибо!

Пол

Ответы [ 3 ]

3 голосов
/ 30 ноября 2011

Это проблема кодирования, кодировкой по умолчанию в Firefox является UTF-8, в то время как в IE это какой-то ISO-XXXX-X, попробуйте установить

 <meta http-equiv="content-type" content="text/html; charset=UTF-8">

в вашем HTML - <head>...</head> это установит кодировку в UTF-8, поэтому IE будет кодировать строку, как это сделал Firefox, и, следовательно, выдает рабочий запрос.

и, кстати, вы должны предоставить HTML-страницу, если вы хотите, чтобы это была ссылка, поэтому вам следует

echo  '<html><head><meta http-equiv="content-type" content="text/html; charset=UTF-8"></head><body>';

, прежде чем повторить <a href=...> и

echo '</body></html>';

после этого.

Таким образом, IE будет использовать данную кодировку UTF-8 при отображении ссылки.

Может показаться, что он будет работать без этого, но тогда IE декодирует заданный <a href=...>, догадывается, что это ссылка, а затем создает вокруг него собственный html-head-body, чтобы отобразить его - который затем включает <meta http-equiv="content-type" content="text/html; charset=ISO-XXXX-X"> вместо.

Если вы просто передаете ссылку через "AJAX" на уже загруженную страницу, убедитесь, что эта страница содержит упомянутый метатег.

0 голосов
/ 29 июня 2012

Проблема только косвенно связана с браузером.urlencode обрабатывает строки как последовательность байтов и в результате зависит от локали, используемой страницей сервера.Большинство веб-серверов проверяют языковые настройки браузера, чтобы определить этот параметр и использовать его для генерации и анализа локализованного текста.Настройки языка IE по умолчанию соответствуют настройкам языка пользователя операционной системы.

Это означает, что Firefox может сообщать английский как предпочтительный язык пользователя, в то время как IE будет сообщать немецкий на том же компьютере.Если вы сначала не преобразуете свою входную строку в UTF8, преобразование будет зависеть от локали клиента

0 голосов
/ 01 декабря 2011

Так что я знаю, что это не может быть правильным решением, но для тех, кто сталкивается с той же проблемой, этот обходной путь работал для меня:

$loc = $_GET['loc'];
$loc = utf8_encode($loc); 
$trans = array("ä" => "ae", "Ä" => "Ae", "ü" => "ue", "Ü" => "Ue", "ö" => "oe", "Ö" => "Oe", "ß" => "ss");
$loc = strtr($loc, $trans);
$loc = urlencode($loc);

Так как мне не нужно сохранять умлауты в моем контексте, это нормально.

...