Який найкращий спосіб роботи з формами, що включають в себе кілька мов і скриптів?
Кращий спосіб обробки кодування в (X) HTML формах є обслуговування всіх ваших сторінок в UTF-8. UTF-8 може представляти символи із широкого спектру мов. Браузери відсилають дані форми в тому ж кодуванні, що і сторінка, що містить форму, так що користувач може заповнити дані на будь-якій мові і скрипті, яких вони потребують.
Є кілька деталей необхідних для того, щоб переконатися що цей підхід працює добре. По-перше, важливо повідомити браузеру, що сторінка форми закодована в UTF-8. Існують різні способи як повідомити браузеру про кодування вашої сторінки. Це важливо в будь-якому випадку, але тим більше, якщо ваша сторінка форми не містить ніяких символів за межами US-ASCII, але ваші користувачі можуть надрукувати інші символи.
Далі, скрипт, що приймає дані користувача повинен переконатися що введені дані дійсно закодовані в UTF-8 кодуванні (на випадок якщо відбулася яка-небудь непередбачена ситуація, наприклад зміна кодування користувачем). Перевірка можлива завдяки тому, що UTF-8 має особливу послідовність байтів, яка не зустрічається в інших кодуваннях. Якщо від користувача надійшли дані в кодуванні, що відрізняється від UTF-8, ми повинні видати йому повідомлення про помилку.
Наприклад, в Perl регулярний вираз, що перевіряє кодування користувача, може виглядати наступним чином:
$field =~ /\A( [\x00-\x7F] # 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, і невірно в іншому випадку.
The above regular expression can be tailored by adding application-related restrictions. As an example, many control characters can be excluded by replacing [\x00-\x7F]
with [\x09\x0A\x0D\x20-\x7E]
.