Какой наилучший способ работы с формами, включающими в себя несколько языков?
Наилучшим способом работы с особенностями кодировок в (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;
Эта конструкция может быть портирована под другие языки программирования.
Она предусматривает обработку различных ошибок связанных с неверным формированием UTF-8. Функция вернет true если переменная $field
в UTF-8, и false в противоположном случае.
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]
.