IE6: ф? Q = ф
FF3.0: .1% 84? Q =% F4
Chrome4: .1% 84? Q = .1% 84
Особливо порадував Фаерфокс. Який символи в частині path закодував як UTF-8, а в частині query - як CP-1251 (взагалі повний привіт, по-моєму).
upd: перевірив: від кодування сторінки результат не залежить ні в одному браузері.
Пролийте хтось промінь світла, будь ласка.
Зазвичай кирилицю в URL кодують з полмощью методів encodeURI і encodeURIComponent.
Firefox надійшов рівно так, як очікується: url кодується в utf8 (така домовленість),
дані форми приїжджають в кодуванні сторінки (так чекатимуть скрипти). ІЕ6 писався
американцями, які не знають нічого, крім latin1 (пор. з IE7, який писали індійці).
Хром засмутив :( Мабуть, він писався американцями, які вірять, що заміна latin1 на
utf8 веде до вирішення всіх проблем з кодуваннями.
Rule of thumb: не використовувати російські букви в url і параметри очікувати в кодуванні сторінки.
Кодування - це наступний крок.
Проблема ж виникає ще до кодування, тому що то, що буде кодуватися, в різних браузерах виявляється різний.
З IE 6 прийде закодоване ф? Q = ф. з FF - закодоване .1% 84? q =% F4. І чорт ногу зломить, що це одна і та ж сторінка прийшла.
Спеціально для Фаерфокса:
Результат той же. Причому не змінюється, якщо кодування поміняти на latin-1.
Так що дані форми приїжджають, скоріше, в кодуванні вінди, ніж в кодуванні сторінки (це єдине у мене припущення, чому він так наполегливо кодує GET-запит в CP-1251), а URL кодується як UTF-8.
Rule of thumb: не використовувати російські букви в url і параметри очікувати в кодуванні сторінки.
На жаль, мені потрібно збирати дані не зі своїх сторінок. Які невідомо в якому браузері проглядаються і взагалі невідомо ким робилися ..
Я вже щас думаю - чи не складе список user-agent'ов по найпоширенішим браузерам і не розібрати чи кожен випадок руками.
Цікаво, як liveinternet з цим впорався.
Загалом, треба думати. Відчуваю, крім якоїсь дикості нічого не придумається ..
Якщо не вдаватися в нетрі кодування кирилиці браузерами, а вирішувати поставлену задачу (збирати урли і Реферер js-лічильниками), то можна взяти рішення ліру. Ось код їх лічильника:
Якщо придивитися, зауважимо, що для кодування урлов вони використовують метод escape, який переводить рядок в шістнадцятковий Unicode. На сервері необхідно для отриманих полів виконати unescape. Такий функції в PHP немає, але можна знайти реалізації. Після php_unescape (обізвав для прикладу) виконай на сервері urldecode, на випадок, якщо URL був в стандартній кодуванні URI.
Воно? Або я не так зрозумів завдання.
Так, воно саме (я, в общем-то, його і використовував, просто подекуди переплутав, тому у мене були помилки).
Мені тут прийшло кілька думок, з яких викладу поки дві:
2. Math.random () покликана не допустити кешування. Чи не можна цього домогтися, віддаючи з сервера лічильника зображення з заголовком "Cache-control: no-cache"?
Referer не завжди передається - security, файрволи та деякі клієнти його ріжуть. no-cache не на всі клієнти діє. Бувають, наприклад, випадки, що в локальній мережі варто кешуючий проксі (заради економії трафіку), який на no-cahe забиває.