Переменная $ _GET с испорченной кодировкой

У меня много проблем с кодированием на моем сайте.

Это моя проблема прямо сейчас, если я analize.php?dialog=árbol в analize.php?dialog=árbol код которого:

 <? echo $_GET['dialog']; echo "sabía"; 

на этом я получаю:

 sabÃa sabía 

Я использую ANSI, меняя на UTF-8 разрывы обоих. Я не понимаю, почему это происходит, также нет кода выше этого. Меня не волнует, как они отображаются, поскольку этот файл используется только для извлечения данных из моей базы данных. Но мне нужно правильно отображать $_GET поэтому я могу включить его в запрос.

Как это может быть сделано?

Вы не можете отправить символ «í» в URL-адрес, URL-адреса должны использовать подмножество кодировки ASCII. Поэтому URL-адрес кодируется в ?dialog=sab%C3%ADa вашим браузером перед отправкой на сервер. %C3%AD представляет два байта C3 AD , который является кодировкой UTF-8 для символа «í». Вы можете подтвердить это с помощью var_dump($_SERVER['QUERY_STRING']); , Это автоматически расшифровывается PHP, результатом является последовательность байтов UTF-8 для «sabía» с кодировкой «í» с использованием двух байтов C3 AD .

Ваш браузер интерпретирует эту последовательность байтов, используя кодировку Windows-1252 или ISO-8859-1. Байт C3 представляет «Ã» в этой кодировке, байт AD представляет собой мягкую дефис и невидим.

Два возможных решения:

  1. используйте UTF-8 везде (рекомендуется!)

    • сохраните исходный код как UTF-8
    • выводит заголовок, который заставляет браузер интерпретировать сайт как UTF-8:

       header('Content-Type: text/html; charset=utf-8'); 
  2. конвертировать значения $_GET в Windows-1252 / ISO-8859-1 (или любую кодировку, которую вы хотите использовать на своем сайте) с использованием mb_convert_encoding или iconv (не рекомендуется)

    • даже в этом случае вы должны установить заголовок, который сообщает браузеру, какую кодировку вы используете

Короче говоря, вам нужно убедиться, что вы используете ту же самую кодировку всюду и указываете браузеру, что именно такое кодирование.