Ποιός είναι ο καλύτερος τρόπος να χειριστεί κανείς θέματα κωδικοποίησης σε φόρμες, οι οποίες μπορεί να χρησιμοποιούν πολλαπλές γλώσσες και scripts;
Ο καλύτερος τρόπος να χειριστείτε θέματα κωδικοποίησης σε (X)HTML φόρμες είναι να παρέχετε όλες τις σελίδες σας σε UTF-8. Η UTF-8 μπορεί να απεικονίσει τους χαρακτήρες στο ευρύτερο φάσμα γλωσσών. Οι φυλλομετρητές στέλνουν πίσω τα δεδομένα της φόρμας με την ίδια κωδικοποίηση, που έχει και η σελίδα που περιέχει την φόρμα, έτσι ώστε ο χρήστης να μπορεί να συμπληρώσει στοιχεία σε οποιαδήποτε γλώσσα και γραφή χρειάζεται.
Υπάρχουν μερικές λεπτομέρειες για να βεβαιωθείτε ότι αυτή η προσέγγιση λειτουργεί καλά. Πρώτον, είναι σημαντικό να δηλώσετε στον φυλλομετρητή ότι η σελίδα της φόρμας είναι σε UTF-8. Υπάρχουν ποικίλοι τρόποι να δηλώσετε στον φυλλομετρητή την κωδικοποίηση της σελίδας σας. Αυτό είναι σημαντικό σε κάθε περίπτωση, αλλά και ακόμα περισσότερο εάν η ίδια η σελίδα της φόρμας σας δεν περιέχει καθόλου χαρακτήρες εκτός US-ASCII, αλλά οι χρήστες σας ίσως πληκτρολογήσουν άλλους χαρακτήρες.
Δεύτερον, ίσως είναι καλή ιδέα το script, που λαμβάνει τα δεδομένα της φόρμας, να ελέγχει αν τα δεδομένα αυτά πράγματι χρησιμοποιούν UTF-8 (σε περίπτωση που κάτι δεν πήγε καλά, π.χ. ο χρήστης άλλαξε την κωδικοποίηση). Ο έλεγχος είναι εφικτός επειδή η UTF-8 έχει μία πολύ συγκεκριμένη διάταξη-byte, που δεν συναντάται σε καμία άλλη κωδικοποίηση. Αν ληφθούν μη-UTF-8 δεδομένα, θα πρέπει να επιστέφεται ένα μήνυμα λάθους.
Για παράδειγμα, σε Perl, ένας έλεγχος για UTF-8 μεσω κανονικής έκφρασης (regular expression) μπορεί να γίνει όπως παρακάτω:
$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;
Η έκφραση αυτή μπορεί να προσαρμοστεί σε άλλες γλώσσες προγραμματισμού. Ελέγχει διάφορα ζητήματα, όπως μη επιτρεπτές overlong κωδικοποιήσεις και μη επιτρεπτή χρήση υποκατάστατων (surrogates). Θα επιστρέψει 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]
.