ΚΕΠΛΗΝΕΤ Ηλείας

Πανελλήνιο Σχολικό Δίκτυο

Το Στέκι των Πληροφορικών

SaferInternet.gr

SafeLine.gr

 

Εφαρμογή Χαρτογράφησης Μονάδων Εκπαίδευσης Ν. Ηλείας

Ενημερωτικό Δελτίο «ΤΠΕ στην Εκπαίδευση» - ΚΕ.ΠΛΗ.ΝΕ.Τ. Ηλείας

25ος Πανελλήνιος Διαγωνισμός Πληροφορικής

2ος Πανελλήνιος Διαγωνισμός Εκπαιδευτικής Ρομποτικής WRO (World Robot Olympiad)

Ημέρα Ασφαλούς Διαδικτύου 2013

Ανακύκλωση Ηλεκτρικών και Ηλεκτρονικών Συσκευών

 

Ιστοσελίδες μονάδων

Αναφορά προβλημάτων

Διαδικτυακά εργαλεία τεχνικού ελέγχου

PHP - Υποστήριξη ελληνικών σε κωδικοποίηση UTF-8

του Νίκου Αδαμόπουλου, εκπαιδευτικού ΠΕ19
Υπεύθυνου ΚΕ.ΠΛΗ.ΝΕ.Τ. ΔΔΕ Ηλείας

Κωδικοποιήσεις ελληνικών χαρακτήρων

Η προβληματική διαχείριση των ελληνικών χαρακτήρων στους υπολογιστές είναι αρκετά παλιά ιστορία και προέρχεται από την υιοθέτηση πολλών ασύμβατων προτύπων και κωδικοποιήσεων από τους διάφορους επίσημους και ανεπίσημους φορείς, κατασκευαστές, αντιπροσώπους, κ.λπ.

Πρώτα είχαμε πρότυπα κωδικοποιήσεων των 8-bit, δηλαδή των 256 χαρακτήρων, όπως ήταν αρχικά το επεκταμένο ASCII, με χρήση της κωδικοσελίδας 737 (που χρησιμοποιήθηκε ευρέως στην εποχή του DOS) και της 869 (αποκλειστικά από την IBM), και στη συνέχεια το πρότυπο ISO-8859, με χρήση της κωδικοσελίδας ISO-8859-7 (ΕΛΟΤ 928) που αποτελεί την πλέον διαδεδομένη κωδικοποίηση των ελληνικών στο ηλεκτρονικό ταχυδρομείο, στον παγκόσμιο ιστό, και αλλού. Επίσης, η Microsoft δημιούργησε την Windows-1253, που διαφέρει από την ISO-8859-7 στη θέση του τονισμένου κεφαλαίου άλφα (Ά) και του ευρώ (€). Όμως, οι κωδικοποιήσεις των 8-bit παρουσιάζουν το πρόβλημα της υποστήριξης μόνο δύο αλφαβήτων κάθε φορά, συνήθως του λατινικού και ενός τοπικού.

Ήδη έχουν αρχίσει να χρησιμοποιούνται πρότυπα κωδικοποιήσεων των 16-bit, όπως το ISO-10646 και το Unicode. Πιο συγκεκριμένα, διαφαίνεται μια τάση μετάβασης προς την κωδικοποίηση UTF-8 (Unicode Character Set - 8) και επικράτησής της στον παγκόσμιο ιστό, και αλλού. Με τις κωδικοποιήσεις των 16-bit επιτρέπεται η ταυτόχρονη απεικόνιση ελληνικών και πολυγλωσσικών κειμένων, αλλά επιτυγχάνεται και υπέρβαση των προβλημάτων και ασυμβατοτήτων των άλλων κωδικοποιήσεων, με μειονέκτημα την απαίτηση περισσότερου χώρου αποθήκευσης και μνήμης που σήμερα πλέον δεν θεωρείται σημαντικό.

Προβλήματα υποστήριξης ελληνικών και UTF-8

Πολλές φορές η προσπάθεια εφαρμογής της κωδικοποίησης UTF-8 μας φέρνει αντιμέτωπους με προβλήματα... στην υποστήριξη των ελληνικών.

Τα περισσότερα από αυτά οφείλονται στο γεγονός ότι η PHP, ακόμα και στις νεότερες εκδόσεις της, δεν προσφέρει την καλύτερη δυνατή υποστήριξη στο Unicode.

Μετά από προσεκτική μελέτη των προβλημάτων, αναζήτηση σχετικών πληροφοριών σε forums, μελέτη των επίσημων προτύπων και προδιαγραφών, και αρκετές δεκάδες δοκιμών, μπορούμε να καταλήξουμε στις παρακάτω αρχές:

1. Όλες οι ιστοσελίδες του δικτυακού τόπου να χρησιμοποιούν ενιαία κωδικοποίηση. Αυτή η τακτική λύνει διάφορα προβλήματα, όπως:

Η δήλωση της κωδικοποίησης γίνεται μέσω της ετικέτας meta στο τμήμα head της ιστοσελίδας:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

2. Τα αρχεία των ιστοσελίδων πρέπει να αποθηκεύονται στην αντίστοιχη κωδικοποίηση. Δεν αρκεί να δηλώνεται η κωδικοποίηση μιας ιστοσελίδας με τον προηγούμενο τρόπο, αλλά πρέπει να συμβαδίζει και με την κωδικοποίηση αποθήκευσή της.

Έτσι, όπως φαίνεται στην παρακάτω εικόνα, για να δηλώσουμε κωδικοποίηση UTF-8 κατά την αποθήκευση στο Notepad (Σημειωματάριο) των Windows XP πηγαίνουμε: Μενού Αρχείο > Αποθήκευση ως...

notepad

Επίσης, στο Adobe Dreamweaver CS3 πηγαίνουμε: Modify > Page Properties > Title/Encoding.

dreamweaver

3. Τα δεδομένα σε βάσεις δεδομένων να χρησιμοποιούν αντίστοιχη κωδικοποίηση. Δηλαδή, σε περίπτωση χρήσης συστημάτων βάσεων δεδομένων τα δεδομένα θα πρέπει να αποθηκεύονται στους πίνακες της βάσης χρησιμοποιώντας την ίδια κωδικοποίηση με αυτήν των ιστοσελίδων στις οποίες χρησιμοποιούνται.

Για παράδειγμα, στη MySQL, που παρέχει και το ΠΣΔ, μπορεί να δηλωθεί η χρήση της κωδικοποίησης UTF-8 σε διάφορα σημεία του συστήματος, όπως σε επίπεδο σύνδεσης, σε επίπεδο βάσης δεδομένων, πίνακα, πεδίου, κ.λπ., όπως φαίνεται και στις επόμενες εικόνες.

phpmyadmin

phpmyadmin

phpmyadmin

4. Ειδική χρήση της PHP ώστε να παρακάμπτονται τα προβλήματα υποστήριξής της στο UTF-8. Στη συνέχεια περιγράφονται δύο τέτοιες περιπτώσεις χρήσης κώδικα PHP: α) Για επικοινωνία με την MySQL, β) Για δημιουργία και αποστολή email.

PHP: Επικοινωνία με MySQL

Σε εκδόσεις της MySQL προγενέστερες της 4.1, ο PHP κώδικας για τη λήψη όλων των εγγραφών του πίνακα tablename της βάσης δεδομένων user_db από τον MySQL Server hostname έχει ενδεικτικά ως εξής:

<html>
<head>
...
<meta http-equiv="Content-Type" content="text/html; charset=iso8859-7" />
...
</head>
<body>
...
<?php
  $ses = mysql_connect("hostname","username","password") 
         or die("Connection error to DB: ".mysql_error());
  mysql_select_db("user_db", $ses);
  $result = mysql_query("SELECT * FROM tablename");
  while($row = mysql_fetch_array($result)) {
    ...
  }
  mysql_close($ses);
?>
...
</body>
</html>

Όπως φαίνεται, λοιπόν, γίνεται χρήση της κωδικοποίησης ISO-8859-7.

Σε εκδόσεις της MySQL μεγαλύτερες ή ίσες της 4.1, υποστηρίζονται πλέον διαφορετικές κωδικοποιήσεις χαρακτήρων σε διάφορα επίπεδα του συστήματος, όπως προαναφέρθηκε. Έτσι, ο αντίστοιχος PHP κώδικας έχει ως εξής:

<html>
<head>
...
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
...
</head>
<body>
...
<?php
  $ses = mysql_connect("hostname","username","password") 
         or die("Connection error to DB: ".mysql_error());
  mysql_select_db("user_db", $ses);
  mysql_query("SET NAMES 'utf8'", $ses);
  $result = mysql_query("SELECT * FROM tablename");
  while($row = mysql_fetch_array($result)) {
    ...
  }
  mysql_close($ses);
?>
...
</body>
</html>

Η ουσιαστική διαφορά, πέρα από την διαφορετική δήλωση της κωδικοποίησης για τη χρήση της UTF-8, είναι η προσθήκη της εντολής

mysql_query("SET NAMES 'utf8'", $ses);

αμέσως μετά την επιλογή της βάσης δεδομένων. Με αυτή την εντολή οι παράμετροι character_set_client, character_set_results και character_set_connection της σύνδεσης που κάνει η PHP με τη βάση δεδομένων θα έχουν την τιμή 'utf8'.

PHP: Δημιουργία και αποστολή email

Η PHP μέσω της συνάρτησης mail δίνει τη δυνατότητα αποστολής ηλεκτρονικού μηνύματος κατά τη δημιουργία της ιστοσελίδας από τον web-server. Παρακάτω φαίνεται ένα απλό τμήμα κώδικα PHP για την αυτόματη δημιουργία και αποστολή email:

<?php
  $sndName = "Sender name";
  $sndAddr = "sendername@domain.gr";
  $rcvAddr = "receivername@domain.gr";
  $sender_name_addr = $sndName." <".$sndAddr.">";
  $subject = "Εmail subject";
  $output = "Τhe message..."; 
  $hdrs = "From: ".$sender_name_addr."\n".
          ... 
          "Message-ID: <".md5(uniqid(time()))."@{$_SERVER['SERVER_NAME']}>\n".
          "X-Mailer: PHP/".phpversion(); 
  if (mail($rcvAddr, $subject, $output, $hdrs)) 
    echo "OK!";
  else 
    echo "Error!";
?>

Αν δεν γίνεται χρήση ελληνικών χαρακτήρων μέσα στο ηλεκτρονικό μήνυμα ή αν χρησιμοποιείται κωδικοποίηση των 8-bit (π.χ. ISO-8859-7) τότε ο παραπάνω PHP κώδικας δεν δημιουργεί πρόβλημα εμφάνισης των χαρακτήρων μέσα στο email πρόγραμμα του παραλήπτη.

Όμως, ο συνδυασμός κωδικοποίησης UTF-8 και χρήσης ελληνικών στο μήνυμα απαιτεί ειδικό χειρισμό προκειμένου το κείμενο να εμφανίζεται σωστά στον παραλήπτη. Παρακάτω, φαίνεται ο PHP κώδικας που επιτρέπει τη σωστή ενσωμάτωση των ελληνικών μέσα στο μήνυμα.

<?php
  $charset="UTF-8";
  $sndName = "Όνομα αποστολέα";
  $sndAddr = "sendername@domain.gr";
  $rcvAddr = "receivername@domain.gr";
  $snd_name_addr_enc = "=?$charset?B?".base64_encode($sndName)."?=".
                       " <".$sndAddr.">";
  $subject = "Θέμα μηνύματος";
  $subject_enc = "=?$charset?B?".base64_encode($subject)."?="; 
  $output = "Κύριο μέρος του μηνύματος..."; 
  $hdrs = "From: ".$sender_name_addr_enc."\n".
          "MIME-Version: 1.0\n". 
          "Content-Type: text/plain; charset=$charset; format=flowed\n".
          "Content-Transfer-Encoding: 8bit\n". 
          "Message-ID: <".md5(uniqid(time()))."@{$_SERVER['SERVER_NAME']}>\n".
          "X-Mailer: PHP/".phpversion(); 
  if (mail($rcvAddr, $subject_enc, $output, $hdrs)) 
    echo "OK!";
  else 
    echo "Error!"; 
?>

Δηλαδή, ενώ αν δεν γινόταν χρήση ελληνικών χαρακτήρων στο όνομα του αποστολέα, θα αρκούσε στο τμήμα headers της συνάρτησης mail το πεδίο:

"From: Sender name <sendername@domain.gr>"

αν όμως θέλουμε να κάνουμε χρήση ελληνικών τότε θα πρέπει το όνομα να κωδικοποιηθεί ανάλογα:

"From: "."=?UTF-8?B?".base64_encode("Όνομα αποστολέα")."?=".
       " <sendername@domain.gr>"

Παρόμοια κωδικοποίηση θα πρέπει να γίνει και σε περίπτωση χρήσης ελληνικών στο θέμα του μηνύματος. Για τη χρήση ελληνικών στο κύριο μέρος του μηνύματος αρκεί η κατάλληλη χρήση των πεδίων MIME-Version, Content-Type και Content-Transfer-Encoding του τμήματος headers, όπως φαίνεται στο παράδειγμα.

Επίλογος

Κλείνοντας, να τονίσουμε ότι δεν είναι στους σκοπούς αυτού του άρθρου η κάλυψη κάθε δυνατής περίπτωσης προβληματικής υποστήριξης των ελληνικών χαρακτήρων, αλλά πρόκειται για μια εισαγωγή στη χρήση της κωδικοποίησης UTF-8 σε ιστοσελίδες.

Επίσης, να σημειώσουμε ότι όλα όσα αναφέρονται παραπάνω δεν αποτελούν μοναδικές λύσεις και σίγουρα μπορεί κανείς να εφαρμόσει κι άλλες που να λειτουργούν σωστά.

URLs:
http://www.php.net
http://www.utf-8.com