bikey77 Δημοσ. 4 Οκτωβρίου 2010 Δημοσ. 4 Οκτωβρίου 2010 Καλησπέρα σε όλους... Σε μια σελίδα έχω ένα product scroller σε flash το οποίο διαβάζει ένα xml που παράγεται δυναμικά με PHP και παρουσιάζει κάποια προϊόντα από μια βάση mysql, το table 'products' είναι utf-8. Το swf δείχνει κάποια scrolling thumbnails και ένα label από κάτω με το όνομα κάθε προϊόντος. O κώδικάς μου είναι: > mysql_select_db($database_connection, $connection); $query_result = "SELECT * FROM product group by rand() limit 20"; $result = mysql_query($query_result, $connection) or die(mysql_error()); $row_result = mysql_fetch_assoc($result); $xml_output = "<?xml version='1.0' encoding=utf-8' ?>\n"; $xml_output .= "<slideshow>\n"; //Opened gallery do { $xml_output .= "\t<photo image=\"images/products/t_".$row_result['picture']."\" url=\"product.php?id=".$row_result['productcode']."&cat=".$row_result['catid']."\" target=\"_self\" info=\"".$row_result['name']."\"/>\n"; } while ($row_result = mysql_fetch_assoc($result)); $xml_output .= "</slideshow>"; //Closed gallery $filename = 'images.xml'; if (is_writable($filename)) { if (!$handle = fopen($filename, 'w')) { echo "Cannot open ($filename)"; exit; } if (fwrite($handle, $xml_output) === FALSE) { echo "Cannot write to ($filename)"; exit; } fclose($handle); } else { echo "The file $filename is not writable"; }?> Το πρόβλημά μου είναι ότι όταν το xml αποθηκεύεται είναι σε ΑΝSI και δε διαβάζονται οι ελληνικοί χαρακτήρες από το swf (οπότε δεν εμφανίζονται οι τίτλοι των προϊόντων). ΑΝ ΟΜΩΣ αποθηκεύσω χειροκίνητα το xml (πχ με notepad) με utf-8 encoding, τότε τα ελληνικά μοιάζουν κάπως έτσι: "ѥ墫ྤᡬ塶갣띪退" ενώ αν πρώτα κάνω copy όλο το κείμενο, αποθηκεύσω το αρχείο ως utf-8, κάνω paste το κείμενο πάνω από το ήδη υπάρχον, τότε όλα λειτουργούν ρολόι. Πως μπορώ να το επιτύχω αυτό με PHP? Δηλ και το αρχείο και το περιεχόμενο να κωδικοποιούνται σε utf-8? Έχει λογική αυτό που λέω ή είναι άκυρο? * :shifty Παραθέτω και παραδείγματα των παραγόμενων xml: (μη γελάσετε, το αντικείμενο είναι μπομπονιέρες, είδη γάμου κλπ...) Παράδειγμα #1: Αποθηκευμένο σε ANSI > <?xml version='1.0' encoding='utf-8' ?> <slideshow> <photo image="images/products/t_824539.JPG" url="product.php?id=824539&cat=21252" target="_self" info="ÌïëõâïèÞêç îýëéíç -ðåéñáôÞò"/> <photo image="images/products/t_231991.JPG" url="product.php?id=231991&cat=21252" target="_self" info="Ðñéãêßðéóóá ìå óôåììáôÜêé"/> </slideshow> Αν αντί fwrite($handle, $xml_output) χρησιμοποιήσω fwrite($handle, utf8_encode(($xml_output)) τότε τα Ελληνικά εμφανίζονται ως "ÌïëõâïèÞêç" και ενώ το xml αποθηκεύεται ως utf-8, και πάλι δεν διαβάζονται από το swf. Παράδειγμα #2: Αποθηκευμένο ως utf-8 > <?xml version='1.0' encoding='utf-8' ?> <slideshow> <photo image="images/products/t_151805.JPG" url="product.php?id=151805&cat=21252" target="_self" info="Φαναράκι ροζ με πεταλούδα"/> <photo image="images/products/t_817001.JPG" url="product.php?id=817001&cat=21252" target="_self" info="Στεμματάκι ροζ σε κουτάκι κοσμηματοθήκη"/> </slideshow> Ιδέες, προτάσεις απόψεις, ΟΛΕΣ δεκτές... έχω σπάσει το κεφάλι μου μέρες τώρα :| Έχει κανείς την ιδέα γιατί μπορεί να συμβαίνει αυτό? *Κάπου διάβασα ότι το αρχείο είναι ό,τι είναι και το περιεχόμενό του, άρα λογικά, αν το περιεχόμενο είναι utf-8 τότε αυτόματα και το αρχείο είναι utf-8 αφού δεν είναι παρά μια ακολουθία χαρακτήρων. Λογικό... ισχύει όμως και αν ναι, τι παραλείπω?
Uberalles_gr Δημοσ. 5 Οκτωβρίου 2010 Δημοσ. 5 Οκτωβρίου 2010 Έχεις δει ότι η βάση σου στα γυρνάει σωστά; Γιατί και εγώ το > $xml_output = "<?xml version='1.0' encoding=utf-8' ?>\n"; χρησιμοποιώ και δεν έχω κανένα πρόλβημα με τα Ελληνικά
bikey77 Δημοσ. 5 Οκτωβρίου 2010 Μέλος Δημοσ. 5 Οκτωβρίου 2010 Πρότεινέ μου κάποιον τρόπο που το δοκιμάζεις για να σου πω... γιατί πλέον έχω μπερδευτεί τόσο με collations, κωδικοσελίδες, encoding, decoding που δεν ξέρω αν όλα αυτά που έχω κάνει λειτουργούν σωστά...
vamitrou Δημοσ. 5 Οκτωβρίου 2010 Δημοσ. 5 Οκτωβρίου 2010 Δοκίμασε το mysql_set_charset. http://www.php.net/manual/en/function.mysql-set-charset.php Καθώς επίσης βάλε και το charset στο header της σελίδας σου.
Crawl_From_Death Δημοσ. 5 Οκτωβρίου 2010 Δημοσ. 5 Οκτωβρίου 2010 Δοκίμασε το $link = mysql_connect($dbhost, $dbuser, $dbpass); $select_db=mysql_select_db($dbname); mysql_query("SET NAMES 'utf8'",$link); λογικά θα σου παίξει ...
spartakoscs Δημοσ. 5 Οκτωβρίου 2010 Δημοσ. 5 Οκτωβρίου 2010 υποθετικά μιλάω μήπως στο textfield πρέπει να κάνεις embed την ελληνική γλωσσά ?
bikey77 Δημοσ. 5 Οκτωβρίου 2010 Μέλος Δημοσ. 5 Οκτωβρίου 2010 Με τη δήλωση mysql_query("SET NAMES 'utf8'",$link); ξαφνικά χάλασε το encoding όλης της σελίδας, όχι μόνο των data αλλά και των html κειμένων μέσα στη σελίδα. Αυτό υποθέτω ότι γίνεται γιατί τα data είναι utf-8 αλλά τα κείμενα όχι... πως μπορώ να εξασφαλίσω (πέρα από το charset της σελίδας), τα ελληνικά σε μια σελίδα να είναι utf-8? Μια ακόμα απορία, ίσως σχετική... μέσα στην index.php κάνω include τις σελίδες header.php, sidemenu.php και footer.php, οι σελίδες αυτές δεν έχουν meta tags για να δηλώνεται το charset, ενώ περιέχουν και ελληνικά αλλά και data από τη βάση. Μήπως κάπου εκεί είναι ένα θέμα, δηλ μπερδεύονται δύο διαφορετικές κωδικοσελίδες και γίνεται ό,τι γίνεται? ---------- Προσθήκη στις 13:12 ---------- Προηγούμενο μήνυμα στις 13:11 ---------- υποθετικά μιλάω μήπως στο textfield πρέπει να κάνεις embed την ελληνική γλωσσά ? Αν μιλάς για το swf, ναι, έτσι είναι και το έχω κάνει. Έχω αρχίσει να πιστεύω ότι δεν έχει να κάνει με το flash αλλά με τα data και τα encodings/charsets.
BonJovi Δημοσ. 5 Οκτωβρίου 2010 Δημοσ. 5 Οκτωβρίου 2010 Ίσως το πρόβλημα να μην είναι από το κομμάτι της php (+mysql). Δοκίμασε αυτό που έγραψε ο spartakoscs. Να κάνεις δηλαδή embed τα ελληνικά fonts στο flash. Όταν κάνεις κλικ σε ένα textfield, στις ιδιότητές του γράφει κάπου Embed. Αν πατήσεις εκεί, επιλέγεις ποια fonts θέλεις να ενσωματωθούν στο flash. Δοκίμασε να βάλεις τα ελληνικά και πες μας αν δούλεψε Διορθώνω το μήνυμα, τώρα είδα ότι το έχεις κάνει ήδη...
bikey77 Δημοσ. 5 Οκτωβρίου 2010 Μέλος Δημοσ. 5 Οκτωβρίου 2010 Ίσως το πρόβλημα να μην είναι από το κομμάτι της php (+mysql). Δοκίμασε αυτό που έγραψε ο spartakoscs. Να κάνεις δηλαδή embed τα ελληνικά fonts στο flash. Όταν κάνεις κλικ σε ένα textfield, στις ιδιότητές του γράφει κάπου Embed. Αν πατήσεις εκεί, επιλέγεις ποια fonts θέλεις να ενσωματωθούν στο flash. Δοκίμασε να βάλεις τα ελληνικά και πες μας αν δούλεψε Διορθώνω το μήνυμα, τώρα είδα ότι το έχεις κάνει ήδη... Πλέον το flash λειτουργεί, χάλασαν όλα τα υπόλοιπα....
Maniakos Δημοσ. 5 Οκτωβρίου 2010 Δημοσ. 5 Οκτωβρίου 2010 Πρέπει να χωρίσεις το πρόβλημα σου. 1. Δες αν η βάση σου και τα tables είναι utf8 2. Δες αν τα php files σου είναι utf8 encoded 3. Εκτύπωσε το xml σου στον browser. Φαίνονται σωστά τα Ελληνικά με page encoding utf8; 4. Φτιάξε ένα xml σαν αυτό που παράγεις με hardcoded τα Ελληνικά μέσα στο XML και φόρτωσέ το στο swf σου. Φαίνονται σωστά;
bikey77 Δημοσ. 5 Οκτωβρίου 2010 Μέλος Δημοσ. 5 Οκτωβρίου 2010 Πρέπει να χωρίσεις το πρόβλημα σου. 1. Δες αν η βάση σου και τα tables είναι utf8 2. Δες αν τα php files σου είναι utf8 encoded 3. Εκτύπωσε το xml σου στον browser. Φαίνονται σωστά τα Ελληνικά με page encoding utf8; 4. Φτιάξε ένα xml σαν αυτό που παράγεις με hardcoded τα Ελληνικά μέσα στο XML και φόρτωσέ το στο swf σου. Φαίνονται σωστά; Μέσα σε όλη αυτή τη διαδικασία μπερδεύτηκα λίγο... αλλά νομίζω ότι είμαι σε καλό δρόμο. Έχουμε και λέμε... 1. Βάση και πίνακες είναι utf-8 2. Τα php files δεν ήταν όλα utf-8, κάποια που ήταν σε iso-8859-7 τα αποθήκευσα ως utf-8 αλλά άρχισαν ΠΟΛΛΑ προβλήματα με την εμφάνιση των κειμένων. 3. Το xml δε φαίνεται σωστά, μάλλον μετά από τις μετατροπές των πινάκων από greek σε utf8 όπου έχουμε δεδομένα που δεν είναι σωστά κωδικοποιημένα στη βάση. 4. Όταν είναι hardcoded εμφανίζεται σωστά. Τα βασικότερά μου προβλήματα αυτή τη στιγμή είναι ότι έχω μια βάση με μισά δεδομένα greek και μισά utf-8 κάποιες σελίδες που αποθήκευσα σε utf-8 πλέον δεν εμφανίζουν σωστά τα static κείμενα
Maniakos Δημοσ. 5 Οκτωβρίου 2010 Δημοσ. 5 Οκτωβρίου 2010 Από ότι φαίνεται δεν φταίει λοιπόν το swf σου. Πρέπει να βεβαιωθείς ότι τα πάντα είναι utf8 πριν αρχίσεις να βάζεις data για να μην έχεις τα προβλήματα που έχεις. Μπορείς να αδειάσεις την db σου και να τα ξαναπεράσεις όλα χειροκίνητα (άμα δεν έχεις πολλές εγγραφές) ή μπορείς να φτιάξεις ένα php script και με την Multibyte String και συγκεκριμένα την mb_convert_encoding να μετατρέψεις ότι δεν φαίνεται σωστά από ISO-8859-7 σε UTF-8 και να το ξαναπεράσεις στην βάση. Είναι λίγο μανούρα όλο αυτό αλλά γίνεται.
bikey77 Δημοσ. 5 Οκτωβρίου 2010 Μέλος Δημοσ. 5 Οκτωβρίου 2010 Από ότι φαίνεται δεν φταίει λοιπόν το swf σου. Πρέπει να βεβαιωθείς ότι τα πάντα είναι utf8 πριν αρχίσεις να βάζεις data για να μην έχεις τα προβλήματα που έχεις. Μπορείς να αδειάσεις την db σου και να τα ξαναπεράσεις όλα χειροκίνητα (άμα δεν έχεις πολλές εγγραφές) ή μπορείς να φτιάξεις ένα php script και με την Multibyte String και συγκεκριμένα την mb_convert_encoding να μετατρέψεις ότι δεν φαίνεται σωστά από ISO-8859-7 σε UTF-8 και να το ξαναπεράσεις στην βάση. Είναι λίγο μανούρα όλο αυτό αλλά γίνεται. Να κάνω ένα loop που να διαβάζει όλα τα data και να τα ξαναρίχνει στη βάση? Ή υπάρχει πιο εύκολος τρόπος? (Είναι 30 tables και καθένα από αυτά έχει αρκετά πεδία... ) Και κάτι ακόμα: πως μπορώ να αλλάξω το charset σε όλα τα php/html αρχεία (προφανώς ένα μαζικό find/replace του encoding από iso-8859-7 σε utf-8 δε θα δουλέψει...
Maniakos Δημοσ. 5 Οκτωβρίου 2010 Δημοσ. 5 Οκτωβρίου 2010 Ναι με ένα loop μπορείς να το κάνεις αλλά πιθανόν θα χρειαστείς και την set_execution_time() να την καλέσεις στην αρχη για να θέσεις ένα μεγάλο execution timeout ώστε να μην πεθάνει το script πριν τελειώσει. Τα files μπορείς από κάποιον editor να τους αλλάξεις το encoding και μετά χειροκίνητα όπου είχες ελληνικά μέσα σε αυτό να τα ξαναπληκτρολογήσεις. Για μαζική αλλαγή δεν γνωρίζω κάποιο tool. Έχεις πολλές εγγραφές στην βάση; Επίσης πριν ξεκινήσεις όλη αυτή την διαδικασία θα σε συμβούλευα να φτιάξεις ένα καινούριο άδειο table και να το γεμίσεις με μερικές εγγραφες οι οποιες θα ειναι utf8 και ΑΦΟΥ έχεις μετατρέψει τα php files σου και να παραγεις το xml σου να δεις ότι όντως αυτό είναι το πρόβλημα.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.