У меня много проблем с кодированием на моем сайте.
Это моя проблема прямо сейчас, если я 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
представляет собой мягкую дефис и невидим.
Два возможных решения:
используйте UTF-8 везде (рекомендуется!)
выводит заголовок, который заставляет браузер интерпретировать сайт как UTF-8:
header('Content-Type: text/html; charset=utf-8');
конвертировать значения $_GET
в Windows-1252 / ISO-8859-1 (или любую кодировку, которую вы хотите использовать на своем сайте) с использованием mb_convert_encoding
или iconv
(не рекомендуется)
Короче говоря, вам нужно убедиться, что вы используете ту же самую кодировку всюду и указываете браузеру, что именно такое кодирование.