Πολυγλωσσικές Φόρμες

Ερώτηση

Ποιός είναι ο καλύτερος τρόπος να χειριστεί κανείς θέματα κωδικοποίησης σε φόρμες, οι οποίες μπορεί να χρησιμοποιούν πολλαπλές γλώσσες και 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]