Jaki jest najlepszy sposób na poradzenie sobie z kwestiami dotyczącymi kodowania w formularzach, które mogą wykorzystywać wiele języków i skryptów?
Najlepszym sposobem na poradzenie sobie z kwestiami kodowania w formularzach (X)HTML jest dostarczanie wszystkich twoich stron kodowanych w UTF-8. UTF-8 daje możliwość przedstawienia znaków z największego zakresu języków. Przeglądarki odsyłają dane z formularza w tym samym kodowaniu, co strona zawierająca formularz, zatem użytkownik może wprowadzać dane w dowolnie wybranym przez siebie języku lub skrypcie.
By mieć pewność, że wszystko będzie działać jak trzeba należy zadbać o kilka drobiazgów. Po pierwsze, ważne jest, aby dać zasygnalizować przeglądarce, że strona zawierająca formularz jest kodowana w UTF-8. Istnieje wiele różnych metod zasygnalizowania przeglądarce kodowania twojej strony. Jest to ważne w każdym przypadku, jednak szczególnie, gdy na twojej stronie zawierającej formularz nie ma żadnych znaków spoza US-ASCII, jednak użytkownicy twojej strony mogą chcieć wpisać inne znaki.
Po drugie, dobrym pomysłem będzie sprawdzenie przez skrypt, który otrzymuje dane z formularza, że dane te rzeczywiście kodowane są w UTF-8 (na wypadek gdyby coś poszło źle, np. użytkownik zmienił kodowanie). Sprawdzenie takie jest możliwe dzięki specyficznemu wzorcowi bajtów kodowania UTF-8 nie występującym w żadnym innym kodowaniu. Jeżeli otrzymane dane nie są kodowane w UTF-8 powinien zostać zwrócony komunikat o błędzie.
Dla przykładu, w Pearlu, regularne wyrażenie sprawdzające kodowanie UTF-8 może wyglądać jak poniżej:
$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;
Wyrażenie to można adaptować w innych językach programowania. Rozwiązuje ono wiele kwestii, takich jak niedozwolone, zbyt długie
kodowania i użycie niedozwolonych odpowiedników. Zwróci wartość true jeżeli $field
okaże się kodowaniem UTF-8, a wartość false w każdym
innym przypadku.
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]
.