Я хочу отправить запись пользователя в 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
Большое спасибо!
Павел
Это проблема с кодировкой, кодировка по умолчанию в Firefox – это UTF-8, а в IE – некоторый ISO-XXXX-X, попробуйте установить
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
в вашем HTML – <head>...</head>
это установит кодировку в UTF-8, поэтому IE будет urlencode строку, как это сделал Firefox, и поэтому создает рабочий запрос.
и, кстати, вы должны предоставить html-страницу, если хотите, чтобы это была ссылка, поэтому вы должны
echo '<html><head><meta http-equiv="content-type" content="text/html; charset=UTF-8"></head><body>';
прежде чем вы <a href=...>
эхо- <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» на уже загруженную страницу, убедитесь, что эта страница содержит упомянутый метатег.
Поэтому я знаю, что это не может быть правильным решением, но для тех, кто сталкивается с одной и той же проблемой, это обходное решение сработало для меня:
$loc = $_GET['loc']; $loc = utf8_encode($loc); $trans = array("ä" => "ae", "Ä" => "Ae", "ü" => "ue", "Ü" => "Ue", "ö" => "oe", "Ö" => "Oe", "ß" => "ss"); $loc = strtr($loc, $trans); $loc = urlencode($loc);
Поскольку мне не нужно сохранять Umlauts в моем контексте, это нормально.
Проблема косвенно связана с браузером. urlencode обрабатывает строки как последовательность байтов и в результате влияет языковой стандарт, используемый на странице сервера. Большинство веб-серверов проверяют языковые настройки браузера, чтобы обнаружить этот параметр и использовать его для локализованного генерации текста и анализа. Настройки языка IE по умолчанию совпадают с настройками языка локализации операционной системы.
Это означает, что Firefox может сообщать английский как предпочтительный язык пользователя, в то время как IE будет сообщать о нем на одном компьютере. Если вы специально не конвертируете свою входную строку в UTF8, конверсия будет зависеть от локали клиента