You are here

Προβλήματα με Ελληνικά

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

Εισαγωγή
Για να υποστηρίζονται τα Ελληνικά στο σύστημα Drupal που θέλουμε να εγκαταστήσουμε θα πρέπει να χρησιμοποιήσουμε κωδικοποίηση UTF-8 (1).

1. HTML Οντότητες
Βεβαιωθείτε ότι το charset που χρησιμοποιείται στο header είναι UTF-8. Αυτό μπορεί να ελέγχει εύκολα εάν δείτε το κώδικα μιας σελίδας του συστήματος Drupal. Πρέπει να περιλαμβάνει στην αρχή το εξής:

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

2. Πίνακες Βάσης Δεδομένων
Βεβαιωθείτε ότι είναι κάτω από κωδικοποίηση UTF-8. Μπορούν να χρησιμοποιηθούν 2 callations, utf_8_general_cι και utf_unicode_cι. Γενικά το utf_unicode_cι collation είναι πιο μεγάλο και πιο αργό. (2), (3)

Εάν δεν θα δημιουργηθούν τεράστιοι πίνακες στη βάση σας, καλύτερα να επιλέξετε utf_8_general_cι.

Εάν οι πίνακες της βάσης δεδομένων έχουν κάποιο άλλο collation τότε πρέπει να αλλαχτούν. Το καλύτερο είναι να γίνουν export τα δεδομένα, αλλαγή του character set και collation και import τα δεδομένα πάλι.

ALTER DATABASE db_name
	CHARACTER SET utf8
	DEFAULT CHARACTER SET utf8
	COLLATE utf8_general_ci
	DEFAULT COLLATE utf8_general_ci;

3. mbstring extension
Το mbstring (4) είναι ένα extension του PHP για μετατροπές κωδικοποιημένων σχημάτων χαρακτήρων (λίγο φτωχή μετάφραση αλλα δεν πειράζει!). Τρέχοντας τη συνάρτηση phpinfo() θα ανακαλύψετε εάν είναι εγκατεστημένο στο σύστημα σας.
Η διαμόρφωση πρέπει να γίνει στο php.ini η στο .htaccess σε shared hosting.

mbstring.language		= Neutral	; Set default language to Neutral(UTF-8) (default)
mbstring.internal_encoding	= UTF-8		; Set default internal encoding to UTF-8
mbstring.encoding_translation	= On		;  HTTP input encoding translation is enabled
mbstring.http_input		= auto		; Set HTTP input character set dectection to auto
mbstring.http_output		= UTF-8		; Set HTTP output encoding to UTF-8
mbstring.detect_order		= auto		; Set default character encoding detection order to auto
mbstring.substitute_character	= none		; Do not print invalid characters
default_charset			= UTF-8		; Default character set for auto content type header

4. Τελευταία Λύση: Θα μιλήσεις UTF-8 θέλεις δεν θέλεις!
Πριν από κάθε σύνδεση με τη βάση δεδομένων χρησιμοποιήστε τις πιο κάτω εντολές για να αναγκάσετε το PHP να μιλήσει UTF-8.

db_query("SET CHARACTER SET 'utf8'");
db_query("SET NAMES 'utf8'");

Πηγες:
1. Unicode Tutorial
2. stackoverflow:difference between utf8_general_ci and utf8_unicode_ci
3. mysql forums:difference between utf8_general_ci and utf8_unicode_ci
4. Multibyte String Functions