Propa Δημοσ. 31 Μαΐου 2011 Δημοσ. 31 Μαΐου 2011 Καλησπέρα σας. αντιμετωπίζω ένα πρόβλημα σχετικά με την πτυχιακή μου. Κατασκευάζω μια ιστοσελίδα με ενα πρόγραμμα ανοιχτού λογισμικού που ονομάζεται omeka. Αυτο που κάνω για αρχή είναι να μεταφράσω ολα τα κομμάτια της ιστοσελίδας. Ως εδώ είπα είμαι καλά... αλλά έπεσα έξω! Βρέθηκα στο σημείο που πρέπει να μεταφράσω κομμάτια που υπάρχουν στην Βάση Δεδομένων μου. Ότι μετάφρασα απο την ιστοσελίδα στην Βάση φαίνονται κινέζικα.... Αντίθετα οτι αλλάζω απο την Βάση μου φαίνονται στην ιστοσελίδα μου με ?????. Έχω προσπαθήσει να αλλάξω όλα τα αρχεία με encoding utf-8 without bom. Επίσης στην βάση μου έχω αλλάξει το charset se utf-8 general_ci και την γλώσσα στα ελληνικά. Έχω προσθέσει οτι λένε σε διάφορα φορουμ στα αρχεια php οπως: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> πριν απο το <?php έχω ξαναπροσπαθήσει να βάλω μόνο το header ('Content-type: text/html; charset=utf-8'); αλλά τίποτα. Καποια ιδέα μήπως έχει κανείς να με βοηθήσει??? δεν ξέρω τι άλλο να κάνω! Ευχαριστώ
defacer Δημοσ. 31 Μαΐου 2011 Δημοσ. 31 Μαΐου 2011 Από την πλευρά της PHP: 1. Αλλάζεις το encoding όλων των αρχείων σε UTF-8, όπως λες ότι έχεις κάνει 2. Βάζεις header ('Content-type: text/html; charset=utf-8'), όπως λες ότι έχεις κάνει 3. error_reporting(E_ALL) (για να είσαι σίγουρος ότι το παραπάνω δουλεύει όπως πρέπει) Από την πλευρά της database: 1. Αλλάζεις το charset της βάσης/tables/columns (double check τα πάντα) σε utf_8 (το collation δεν ιδιαίτερη σημασία γι' αυτό που συζητάμε) 2. Αλλάζεις το charset του server σε utf_8 Αν ακόμα δεν παίζει, τότε troubleshooting: τι μπορεί να πηγαίνει στραβά; Κάτι από τα παρακάτω: 1. Τα δεδομένα σου δεν είναι αποθηκευμένα σωστά σαν UTF-8 στη βάση 2. Τα δεδομένα σου δεν περνάνε σωστά από τη βάση στην PHP 3. Τα δεδομένα σου δεν περνάνε σωστά από την PHP στον browser Για να βεβαιωθείς για το 1, κατέβασε το HeidiSQL (freeware, πίνω νερό στ' όνομά του) και δες τη βάση σου μέσα από αυτό, βάλε/κάνε edit πράγματα κλπ. Αν τα βλέπεις σωστά εκεί, αποκλείουμε αυτό το σενάριο. Για το 2, δες τι τιμή επιστρέφει η mysql_client_encoding αν συνδέεσαι με mysql(i). Σε κάθε περίπτωση, βάλε μία mysql_set_charset('utf-8') και δες αν αυτό σου λύνει το πρόβλημα. Αν συνδέεσαι με PDO, τότε $db->exec('SET NAMES utf-8'). Το 3 το ανέφερα για λόγους πληρότητας, από τη στιγμή που δίνεις charset στον Content-Type header δεν παίζει να πάει κάτι στραβά εκεί. Αλλά μπορείς πολύ απλά να κάνεις echo ελληνικά από ένα PHP αρχείο που είναι σωσμένο σαν UTF-8, αν τα ελληνικά εμφανιστούν σωστά τότε όλα είναι εντάξει όσον αφορά αυτό το ενδεχόμενο.
dewn735 Δημοσ. 1 Ιουνίου 2011 Δημοσ. 1 Ιουνίου 2011 Δοκίμασε μετά από τη σύνδεση στη βάση αυτό: >mysql_query("SET NAMES greek"); ή αυτό: >mysql_query("SET NAMES utf8"); edit: μετά είδα ότι το ανέφερε και ο defacer
Propa Δημοσ. 1 Ιουνίου 2011 Μέλος Δημοσ. 1 Ιουνίου 2011 Ευχαριστω πολύ για την απάντηση αυτο $db->exec('SET NAMES utf-8'). οντως δεν το είχα βρει πουθενα και μαλλον το χρειαζόμουνα... οσο για τα αλλα προσπαθω λιγο γιατι είμαι αρχάριος τωρα προσπαθω να δουλεψω με το HeidiSQL τελικα να τα βαλω με αυτο ε? header ('Content-type: text/html; charset=utf-8') γιατι σημερα με πιασανε τα νευρα μου και το αλλαξα με το <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> αα και κατι τελευταίο το error_reporting(E_ALL) το βάζω αμέσως μετα το header? ευχαριστω και πάλι!
defacer Δημοσ. 1 Ιουνίου 2011 Δημοσ. 1 Ιουνίου 2011 Το σωστό είναι το content encoding να το δηλώνεις με header(), οπότε το <meta> μπορείς να το πετάξεις. Το doctype declaration και τα λοιπά (<html>, <head>) προφανώς μένουν. Το error_reporting καλό είναι να μπει πολύ πολύ αρχή, βασικά πριν από ο,τιδήποτε άλλο. Προσωπικά το μόνο που επιτρέπω να μπει πάνω από error_reporting είναι κανένα define() ή κανένα ini_set(). Ο λόγος που το βάζεις είναι για να βάλεις την PHP να σου δίνει και σφάλματα E_NOTICE, όχι μόνο από E_WARNING και πάνω. Κώδικας χωρίς notice == κεφάλι με λιγότερες σκοτούρες όταν έρθει η ώρα για debugging (και θα έρθει, το ξέρουμε όλοι ). Μια μίνι επεξήγηση για το τι έγινε εδώ: Πολύ συνοπτικά, αυτό που κάνεις με το SET NAMES είναι να καθορίζεις το encoding των δεδομένων στη σύνδεση ανάμεσα στη MySQL και την PHP (δηλαδή την αντιστοιχία από χαρακτήρες στην MySQL σε bytes), το λεγόμενο connection encoding. Αν το connection encoding είναι π.χ. ISO-8859-1 (Latin) τότε τα ωραία ελληνικά σου θα γίνουν ερωτηματικά από τη MySQL πριν τα στείλει καν γιατί το ISO-8859-1 δεν έχει ελληνικά. Αν το βάλεις connection encoding σε ISO-8859-7 (Greek), τότε ναι μεν θα μεταφερθούν στην PHP σαν ελληνικά, αλλά όταν από την PHP τα κάνεις echo o browser (που του έχεις πει Content-Type: ... charset=utf-8) θα προσπαθήσει να μεταφράσει τα bytes που έγιναν encode σε ISO-8859-7 σα να ήταν UTF-8, και θα δεις κινέζικα και άλλα τέτοια ωραία. Στην περίπτωση αυτή, μπορείς να μετατρέψεις το ISO-8859-7 σε UTF-8 πρώτα και μετά να το κάνεις echo, για παράδειγμα: > <?php header ('Content-type: text/html; charset=utf-8'); $db->exec('SET NAMES iso-8859-7'); $string = $db->query(.....); echo $string; // κινέζικα // αλλαγή κωδικοποίησης $string = iconv('ISO-8859-7', 'UTF-8', $string); echo $string; // τώρα εμφανίζονται σωστά Φυσικά δεν υπάρχει λόγος να το κάνεις αυτό αφού γράφεις εφαρμογή από την αρχή χωρίς δεσμεύσεις. Happy coding.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.