Я знаю, я не должен использовать ISO-8859-1, однако у меня есть этот веб-сайт, который был обработан для меня, и будет невозможно перенести весь PHP / JS / HTML для использования UTF-8 вместо ISO-8859-1. .
Моя проблема заключается в следующем: этот сайт использует encodeURIComponent
для хранения значений в файлах cookie с помощью Javascript. Например, в файле index.html
(в котором используется <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
) есть тег <script>
с этим кодом внутри:
document.cookie = "xxx=" + encodeURIComponent("não") + ";.....";
Значение cookie сохраняется как n%C3%A3o
(я проверял инструменты разработчика в Chrome на вкладке приложения). Несмотря на то, что файл HTML является ISO, файл cookie сохраняется как UTF-8. Большой! Именно так работает encodeURIComponent
, он всегда будет конвертировать его в UTF-8.
Проблема возникает, когда страницы PHP используют это значение xxx
cookie для выполнения каких-либо задач. Поскольку все файлы PHP были сохранены как ISO-8859-1, при попытке доступа к $_COOKIE["xxx"]
начинают возникать проблемы, такие как повреждение символов.
Очевидно, что я должен использовать utf8_decode($_COOKIE["xxx"])
, чтобы решить эту проблему, потому что он получает значение cookie и анализирует его по ISO-8859-1.
Проблема в том, что на этом сайте сотни файлов PHP, которые повсеместно используют файлы cookie. Изменение всех строк кода потребует много времени, чего у меня нет, поскольку мой начальник хочет, чтобы эта проблема была решена на сегодняшний день.
Итак, вот мой вопрос:
1) откуда PHP знает, что куки должны читаться как UTF-8 и назначать кодировку UTF-8 для $ _COOKIE? Когда я обращаюсь к $ _COOKIE, он явно уже декодировал значение cookie, потому что %xx
уже были декодированы. Я знаю, что вы могли бы сказать Of course you dumb, cookies are all the time stored as UTF-8.
. Но это не всегда так.
Если внутри файла PHP (который был сохранен с использованием кодировки ISO-8859-1), я делаю это:
setcookie("xxx","não");
Когда я проверяю файл cookie (в Chrome Dev Tools -> вкладка «Приложение»), он показывает n%E3o
.
Видишь? n%E3o
отличается от n%C3%A3o
.
Итак, при разборе файла cookie, откуда PHP знает, что n%E3o
должен быть декодирован как ISO-8859-1, и как PHP знает, что n%C3%A3o
должен быть декодирован как UTF-8?
Я знаю, что суперглобальные переменные _GET
, _POST
, _COOKIE
автоматически декодируются PHP. Но как он узнает исходную кодировку и как он решает, какую кодировку вывести?