Багатомовні форми кодування

Intended audience: шифрувальники XHTML/HTML (за допомогою редакторів і скриптів), розробники скриптів (PHP, JSP, і т. п.), менеджери Веб проектів, і кожен, хто шукає інформацію про те, як поводитися з кодуваннями в формах.

Question

Який найкращий спосіб роботи з формами, що включають в себе кілька мов і скриптів?

Answer

Кращий спосіб обробки кодування в (X) HTML формах є обслуговування всіх ваших сторінок в UTF-8. UTF-8 може представляти символи із широкого спектру мов. Браузери відсилають дані форми в тому ж кодуванні, що і сторінка, що містить форму, так що користувач може заповнити дані на будь-якій мові і скрипті, яких вони потребують.

Є кілька деталей необхідних для того, щоб переконатися що цей підхід працює добре. По-перше, важливо повідомити браузеру, що сторінка форми закодована в UTF-8. Існують різні способи як повідомити браузеру про кодування вашої сторінки. Це важливо в будь-якому випадку, але тим більше, якщо ваша сторінка форми не містить ніяких символів за межами US-ASCII, але ваші користувачі можуть надрукувати інші символи.

Далі, скрипт, що приймає дані користувача повинен переконатися що введені дані дійсно закодовані в UTF-8 кодуванні (на випадок якщо відбулася яка-небудь непередбачена ситуація, наприклад зміна кодування користувачем). Перевірка можлива завдяки тому, що UTF-8 має особливу послідовність байтів, яка не зустрічається в інших кодуваннях. Якщо від користувача надійшли дані в кодуванні, що відрізняється від UTF-8, ми повинні видати йому повідомлення про помилку.

Наприклад, в Perl регулярний вираз, що перевіряє кодування користувача, може виглядати наступним чином:

$field =~
  m/\A(
     [\x09\x0A\x0D\x20-\x7E]            # ASCII
   | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
   |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
   | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
   |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
   |  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
   | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
   |  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
  )*\z/x;

Цей вираз може бути адаптований для інших мов програмування. Він піклується про такі різні питання, як неправильні занадто довгі кодування і неправильне використання сурогатів. Він повернеться вірно, якщо змінна $field закодована в UTF-8, і невірно в іншому випадку.