$ _COOKIE глобальная переменная кодировка - PullRequest
0 голосов
/ 10 сентября 2018

Я знаю, я не должен использовать 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. Но как он узнает исходную кодировку и как он решает, какую кодировку вывести?

1 Ответ

0 голосов
/ 10 сентября 2018

PHP на самом деле совсем не «знает» о кодировках.И в этом случае это не нужно. Процентное кодирование , которое используется для файлов cookie, явно работает на уровне байтов нейтрального кодирования.Это означает, что сама кодировка выражает необработанные байты.%C3%A3 выражает два байта 0xC3A3, который является кодировкой UTF-8 для символа "ã".Или это кодировка символов "Ã £", если вы читаете их как ISO-8859-1.Так что PHP просто декодирует процентную кодировку в необработанные байты;какие персонажи заканчиваются тем, с чем вы их интерпретируете.PHP вообще их не интерпретирует, строки PHP - это просто необработанные байтовые массивы.

И наоборот, любой строковый литерал в файлах исходного кода PHP просто является опять-таки необработанным байтовым массивом, содержимое которого зависит от кодировки источника.Файл кода сохраняется в. В файле PHP, сохраненном как ISO-8859-1, строковый литерал "não" содержит байты 0x6EF16F.Тот же файл, что и UTF-8, содержит байты 0x6EC3A36F.В процентном кодировании эти необработанные байты просто кодируются как есть.

См. Что абсолютно необходимо знать каждому программисту о кодировках и наборах символов для работы с текстом для получения дополнительной информации по теме.

...