Xpoint
   [напомнить пароль]

Как браузеры посылают Unicode из формы?

Метки: [без меток]
2005-02-13 00:38:03 [обр] Дмитрий Котеров(15/912)[досье]

Вопрос: как по стандарту должны вести себя браузеры, когда видят в форме символ, не попадающий в кодировку текущей страницы? Как они его должны передавать, в каком виде?

Маленький тест на "правильность" браузера. Зайдите IE на http://dklab.ru/t1.php и введите в форму следующие иероглифы (скопируйте прямо отсюда мышкой):

單獨測試它容易

Если в ответ сверху отобразится что-то типа "љdаХ‘ЄЋЋ›Ђ—e€Х", значит, кодировка побилась. А если отобразились entities с амперсандами ("單獨測試它容易"), значит, все ОК.

Страница в кодировке Windows-1251. Самое смешное, что еще пару дней назад все браузеры (IE, Opera, FF) прекрасно обрабатывали иероглифы - вставляли их в POST как urlencode("&#DDDD;") (я думал, это и есть стандарт!). А теперь вдруг - IE и Opera перестали. Единственное, что менял в системе, - поставил последние заплатки с microsoft.com. В FF по-прежнему работает все правильно.

Но еще смешнее, что вот тут:
http://forum.dklab.ru/about/test/Test_21.html
точно самое, и оно как работало в IE, так и продолжает работать! Причем
http://forum.dklab.ru/dk_improve/t/unicode/t1.php
- не работает, так что виноваты не настройки сервера (и заголовки я сравнивал, в частности, Accept-Language - они идентичны).

Я в полной растерянности, что же это такое может быть.

спустя 1 минуту [обр] Дмитрий Котеров(15/912)[досье]
Так, иероглифы на самом деле - вот они:
單獨測試它容易
Именно их надо копировать в форму!
Видимо, xpoint-овский js неправильно закэшировался.
спустя 10 минут [обр] Давид Мзареулян(9/1003)[досье]
спустя 14 минут [обр] Дмитрий Котеров(15/912)[досье]

Не уверен, что оно. Скорее не оно, чем оно, хотя похоже.
Меня сильно удивляет, почему же раньше все прекрасно работало.

В общем, я так понимаю, что вопрос - труба. И единственный выход - делать в скрипте

  1. ob_start("перекодируем-в-UTF8-и-меняем-meta");
  2. в начале скрипта вручную перекодировать $_REQUEST назад в windows-1251 из UTF-8.

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

спустя 6 часов [обр] Дмитрий Котеров(15/912)[досье]

На самом деле, я погорячился. Можно обойтись и без UTF-8, только надо превращение не-windows символов делать вручную на JavaScript. Примерно по той же схемой, как это сделано тут на форуме. Я уже так попробовал сделать (замена "на лету" элементов полей на одноименные hidden-элементы перед submit-ом, а потом назад), вроде работает нормально.

В общем, как говорили древние японцы,
あなたのコンピュータを確認しなさい

спустя 2 часа 20 минут [обр] AB...(0/233)[досье]
А, что если попробовать поставить в скрипте t1.php
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
спустя 4 часа 45 минут [обр] Давид Мзареулян(9/1003)[досье]
Но Вы же сами пишете, что в старой форме всё работает. Там же как раз и стоит <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">. Попробуйте это вставить в t1 — как AB...[досье] советует.
спустя 3 часа 36 минут [обр] Дмитрий Котеров(15/912)[досье]
Пробовал, конечно же, в первую очередь. И не раз. Результат нулевой.
спустя 40 минут [обр] Давид Мзареулян(9/1003)[досье]
Ну, Вы всё-таки поставьте мету в действующую версию. А то ж и не проверишь эффект…
спустя 4 часа 26 минут [обр] Дмитрий Котеров(15/912)[досье]
Поставил.
спустя 27 минут [обр] Давид Мзареулян(9/1003)[досье]
Проверил. Получилось &#21934;&#29544;&#28204;&#35430;&#23427;&#23481;&#26131;. IE 6.0.26000.итд.
спустя 1 час 19 минут [обр] Дмитрий Котеров(15/912)[досье]

Хм, весьма странно. Вот, можно выбирать, использовать META или нет:
http://forum.dklab.ru/dk_improve/t/unicode/t2.php

Но META тут точно ни при чем, потому что я как на этот баг наткнулся: на локальной версии форума. Там META как выводилась, так и выводится, а - вдруг заглючило. И проверял я потом многократно с META...

В общем, похоже, что-то где-то запоминается и потом мешает.

спустя 10 минут [обр] AB...(0/233)[досье]
Дмитрий Котеров[досье], не meta дает определенные инсьрукции броузер.
А если сервер выдаете koi8-r, а вы при указываете в meta как windows-1251, то на экране точно получается беспорядок. Броузер считает, что это windows-1251 и не проверяет уже в каком виде получил документ.
спустя 1 час 16 минут [обр] Дмитрий Котеров(15/912)[досье]
Сервер выдает в заголовках не koi, в windows-1251.
спустя 14 минут [обр] AB...(0/233)[досье]
Дмитрий Котеров[досье], это я к примеру про koi.
спустя 2 дня 10 часов [обр] Давид Мзареулян(9/1003)[досье]

Дмитрий Котеров[досье] Проверил t2 — всё работает как часы: без меты глючит, с метой — нет. Но у меня IE голый, без сервиспаков, а Вы говорите, что заплатки какие-то ставили. Я правильно понимаю, что у Вас что с метой, что без — один чёрт?

ОК, давайте разберёмся, что это за кодировка. Если это Shift-JIS, то, значит, глюк всё тот же, и надо понять, отчего у Вас не действует мета. Попробуйте скопировать туда строку АБВГДЕЁЖЗИЙКЛ&&#945&& (как у меня в ЖЖ было), а результат пропустить через urlencode, чтобы были видны коды символов. Если получится %84%40%84%41%84%42%84%43…, то это Shift-JIS.

спустя 22 секунды [обр] Давид Мзареулян(9/1003)[досье]
Строку читать как
АБВГДЕЁЖЗИЙКЛα
спустя 8 часов [обр] Дмитрий Котеров(15/912)[досье]

Давид, у меня тоже теперь не глючит с метой. Однако известно точно, что раньше он с метой глючил. Иначе как, по-вашему, я вообще узнал про данную особенность? А очень просто: открыл как-то на localhost-е локальную (отладочную) версию форума, а там - бац! - не работают иероглифы. Мету я вообще не трогал: она там прописана в самом верхнем шаблоне, я туда не лазил. Сейчас баг воспроизвести уже не удается, но у меня нет ни малейших сомнений, что он был (потому что, если бы его не было с метой, я бы ни о чем и не заподозрил даже).

К тому же в Опере все равно вопросики, что с метой, что без.

спустя 8 часов [обр] AB...(0/233)[досье]
Вы знаете Дмитрий Котеров[досье], у меня на работу у одной машине постоянно возникают подобные причуды на IE. Причем никто не знает когда это произойдет и по какой причине, но точно известно, что через день или два все становится нормально. Хотя в FF данной причуды не возникает.
спустя 9 часов [обр] Давид Мзареулян(9/1003)[досье]
Дмитрий Котеров[досье] Т.е. для Оперы вопросики — это стабильное поведение? Entity она вообще никогда не использует?
спустя 2 часа 13 минут [обр] Владимир Палант(49/4445)[досье]
У меня использует — Opera 7.54.
спустя 8 часов [обр] Дмитрий Котеров(15/912)[досье]

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

У меня лично 7.23, там - вопросики всегда и везде.
С JS-алгоритмом преобразования Unicode в entities, примерно как тут, - работает замечательно.

спустя 3 часа 42 минуты [обр] AB...(0/233)[досье]
Opera 8.00 Build 7401
Meta on, result is &#21934;&#29544;&#28204;&#35430;&#23427;&#23481;&#26131;
Meta off, result is &#21934;&#29544;&#28204;&#35430;&#23427;&#23481;&#26131;
спустя 12 минут [обр] Дмитрий Котеров(15/912)[досье]
Вы только это... чтобы "meta on" и "meta off" сработали, надо сначала флажок установить и нажать кнопку вхолостую, а уж затем вводить иероглифы и нажимать кнопку (с тем же положением флажка). Т.е. по 2 нажатия на каждый тест, а не по одному (по очевидным причинам: первое вставляет на страницу тэг meta, а второе - отправляет иероглифы).
спустя 1 час 13 минут [обр] AB...(0/233)[досье]

Дмитрий Котеров[досье], привожу поностью ответ с вашей странички.

REQUEST:
Array
(
    [t] => &#21934;&#29544;&#28204;&#35430;&#23427;&#23481;&#26131;
    [m] => on
    [noimg] => 1
    [phpbb2mysql_data] => s:0:\"\";
    [phpbb2mysql_wuid] => 50004614-79fd8e3675e80a83354f9ae330baa7f0
)

и второй вариант

REQUEST:
Array
(
    [t] => &#21934;&#29544;&#28204;&#35430;&#23427;&#23481;&#26131;
    [noimg] => 1
    [phpbb2mysql_data] => s:0:\"\";
    [phpbb2mysql_wuid] => 50004614-79fd8e3675e80a83354f9ae330baa7f0
)

Наверное только так поверите.

спустя 3 минуты [обр] AB...(0/233)[досье]
Соответсвенно пробовал и как вы просите и без холостого нажатия тоже. Ответы &#21934;&#29544;&#28204;&#35430;&#23427;&#23481;&#26131; всегда были одни и теже. В результате четыре пробы и все ответы согласно ваших требований.
Powered by POEM™ Engine Copyright © 2002-2005