Как мне прочитать URL-адрес Unicode с PHP? - PullRequest
1 голос
/ 07 декабря 2009

У меня есть URL-адрес Unicode: \ test.php? SText = Московский

Я бы хотел использовать функцию $ _Get для работы со значением sText. У меня есть код для test.php:

<?php
$sVar = $_GET['sText'];

echo "Variable = $sVar";
?>

Проблема в том, что вышеприведенное выглядит как: Переменная = ??????????

Что мне нужно сделать?

Ответы [ 5 ]

1 голос
/ 05 августа 2017

Это прекрасно работает для меня:

$sVar = $_GET['sText'];

echo urldecode($sVar);
1 голос
/ 07 декабря 2009

Спасибо за все отзывы.

Я перепробовал все примеры, но я все еще получаю вопросительные знаки, даже после сохранения как utf-8.

Есть ли параметр php.ini, который мне может понадобиться добавить / включить, возможно, чтобы разрешить поддержку юникода?

В настоящее время для меня все равно следующий код:

<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
<body>
<?php
$sVarControl = "Московский";
$sVar = $_GET['sText'];

echo "Control = $sVarControl <br />";
echo "Variable = $sVar <br />";

?>
</body>
</html>

Создает следующий вывод:

Control = Московский
Переменная = ??????????

Таким образом, страница способна работать с юникодом и отображать его. Может быть, это ограничение функции $ _GET?


EDIT

Я только что попытался запустить страницу в Google Chrome, и она работает отлично. Это заставляет меня думать, что это настройка IE. Но что? И как мне обойти это?

1 голос
/ 07 декабря 2009
  • Вам нужно вернуть заголовок типа контента UTF-8 с вашим test.php header('content-type: text/html; charset=utf-8');
  • Вам нужно сохранить свой test.php в кодировке UTF-8 (не уверен в этом, но все равно не пострадает)
0 голосов
/ 09 декабря 2009

Я наконец-то решил эту проблему, спасибо всем за несколько полезных советов (см. Последний абзац этого поста для быстрого ответа).

Я делал что-то неправильно, что мешало.

Я впервые заметил свои проблемы с кодированием, когда записи не записывались в мою базу данных, все базы данных и таблицы были настроены на utf-8, так что оставил php.

Для простоты я создал тестовую страницу php, чтобы продемонстрировать проблему. Поскольку страница получала ($ _GET) значения из URL-адреса, когда я загружал свою тестовую страницу, я делал это с помощью параметра Unicode в URL-адресе test.php? SText = Московский

Проблема для меня, я думаю, заключалась в том, как IE взаимодействовал с URL-адресом, по какой-то причине он не мог декодировать его или распознавать как Unicode. Это стало очевидным, когда я запустил страницу с ошибкой im Chrome, и она отлично работала.

Я начал использовать следующую функцию для вывода полного URL в Chrome и IE

<?php
function curPageURL() {
 $pageURL = 'http';
 if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
 $pageURL .= "://";
 if ($_SERVER["SERVER_PORT"] != "80") {
  $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
 } else {
  $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
 }
 return $pageURL;
}

echo curPageURL();
?>

Internet Explorer 8 повторил следующее:

http://localhost/FirstProject/test.php?sText=??????????

Однако Chrome повторил закодированный URL:

http://localhost/FirstProject/test.php?sText=%D0%9C%D0%BE%D1%81%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%B8%D0%B9

Как вы можете видеть, chrome автоматически кодировал URL-адрес, а PHP автоматически считывал и декодировал его правильно, предположительно, потому что я установил тип содержимого UTF-8 (спасибо Филиппу).

Я все еще не был уверен, почему IE ведет себя так, но это подтолкнуло меня в направлении кодирования URL-адреса на странице вызова. Я звонил на страницу в javascript, поэтому я попробовал функцию encodeURIComponent(). К счастью, это сработало, и теперь я получаю одинаковый результат в CHROME и IE.

Короче говоря, если я использую encodeURIComponent() для кодирования вызывающего URL-адреса, я гарантирую, что установил тип содержимого целевой страницы php на header('content-type: text/html; charset=utf-8');, все переменные URL-адреса Юникода обрабатываются правильно.

Еще раз спасибо за вашу помощь. Craig

0 голосов
/ 07 декабря 2009

Я пытался использовать функцию iconv () для решения вашей проблемы (параметры функции могут различаться в зависимости от конфигурации вашей системы):

$get = iconv('CP1251', 'UTF-8', $_GET['text']);
echo 'Variable = '.$get; // Variable = Московский

Вы можете прочитать о функциях iconv . Надеюсь, это будет полезно для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...