@Mansur05

Почему Microsoft Edge не определяет кодировку?

В Cookies лежит json строка с кодировкой UTF-8. При просмотре cookies через отладчик (F12) кодировка корректна.
При выводе на экран через php - кодировка ломается, но если проверить кодировку этой строки через mb_detect_encoding(), то кодировка UTF-8. В html так же указана кодировка UTF-8.

Скрин с отладчика. (F12)
5e71cc62b9eaf144774627.png

Скрин вывода (Последняя строка - результат mb_detect_encoding($_COOKIES['suggestions']))
5e71cc9a03bce832110243.png

Скрин html
5e71cce2d11b9739798282.png

Код, которые это все выводит
var_dump($_COOKIE['suggestion']);
echo '<br>' . mb_detect_encoding($_COOKIE['suggestion']);


Подвопрос - 1:
Идем дальше, при декодировании json меняется кодировка на ASCII, почему?
$organization = json_decode($_COOKIE['suggestion']);
var_dump($organization);
echo '<hr>';
echo mb_detect_encoding($organization);
echo '<hr>';
echo json_last_error_msg();


Вывод
5e71ceb5c1bcf601370677.png

При этом, если я открою этот же файл в другом браузере, например firefox, то результат работы всего скрипта будет:
5e71ce7e46242370622084.png
Странно что таких ошибок в выводе Edge нет.

Почему такое происходит?
  • Вопрос задан
  • 2141 просмотр
Решения вопроса 1
@Mansur05 Автор вопроса
Методом тыка новыми кодировками в этот несчастный браузер установил что, для браузеров от Microsoft нужно использовать windows-1251.

UPD: Наврал.
Метод, которым php проверяет кодировку работает неверно. (mb_detect_encoding()). Методом тыка выяснил реальную кодировку - windows-1251. И через iconv изменил кодировку куки на UTF-8
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Ответ на подвопрос - 1:
Потому что json_decode() вернул null, а mb_detect_encoding(null) даст ASCII. И ещё, лучше делать json_decode($_COOKIE['suggestion'], true) потому что внутри - ассоциативный массив!
Ответ написан
Комментировать
В скрипте перед var_dump попробуйте header('Content-Type: text/plain; charset=utf-8');
Ответ написан
@Flying
Так происходит потому что вы просматриваете ответ сервера в браузере вместо того чтобы просматривать его в оригинале. Конечно кажется что браузер показывает то что ему прислали, на уровне обывательского опыта это так и есть, но как разработчик вы обязаны помнить что браузер - очень сложная система и его задача - рендер присланных html страниц. Вы же пытаетесь заставить браузер интерпретировать ваш, по сути, вывод в отладочный лог не побеспокоясь о том чтобы объяснить браузеру что же вы ему прислали. Да, это удобно, но тем самым вы неосознанно полагаетесь на эвристики браузера - именно это и приводит к описанному вами эффекту.

Если говорить более конкретно - то ваша ошибка состоит в том что вы не использовали ни одного из возможных вариантов увидеть данные "как есть" и не сообщили браузеру что за данные вы ему передаёте.

Навскидку вы могли:
  1. Сообщить что вы посылаете текстовые данные, а не html, через header('Content-Type: text/plain; charset=utf-8');
  2. Сообщить что вы посылаете данные в кодировке utf-8 через header('Content-Type: text/html; charset=utf-8');
  3. Смотреть на исходный текст, а не на рендер страницы (Ctrl+U вроде бы)
  4. Просто вывести данные в текстовый лог через error_log($data,3,__DIR__.'/debug.log');
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега РНР
Знаки вопроса в ромбиках означают, что строка не в utf-8
Что странно, поскольку джейсон не понимает других кодировок.

Какими-то ты совсем странными извращениями занимаешься.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы