Προς το περιεχόμενο

The php, mysql, xml and flash mystery... σπαζοκεφαλιά!


bikey77

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα σε όλους...

 

Σε μια σελίδα έχω ένα 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 αφού δεν είναι παρά μια ακολουθία χαρακτήρων. Λογικό... ισχύει όμως και αν ναι, τι παραλείπω?

Δημοσ.

Έχεις δει ότι η βάση σου στα γυρνάει σωστά;

 

Γιατί και εγώ το

>
$xml_output = "<?xml version='1.0' encoding=utf-8' ?>\n";

χρησιμοποιώ και δεν έχω κανένα πρόλβημα με τα Ελληνικά

Δημοσ.

Πρότεινέ μου κάποιον τρόπο που το δοκιμάζεις για να σου πω... γιατί πλέον έχω μπερδευτεί τόσο με collations, κωδικοσελίδες, encoding, decoding που δεν ξέρω αν όλα αυτά που έχω κάνει λειτουργούν σωστά... :fear:

Δημοσ.

Με τη δήλωση 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.

Δημοσ.

Ίσως το πρόβλημα να μην είναι από το κομμάτι της php (+mysql). Δοκίμασε αυτό που έγραψε ο spartakoscs. Να κάνεις δηλαδή embed τα ελληνικά fonts στο flash. Όταν κάνεις κλικ σε ένα textfield, στις ιδιότητές του γράφει κάπου Embed. Αν πατήσεις εκεί, επιλέγεις ποια fonts θέλεις να ενσωματωθούν στο flash. Δοκίμασε να βάλεις τα ελληνικά και πες μας αν δούλεψε :)

 

Διορθώνω το μήνυμα, τώρα είδα ότι το έχεις κάνει ήδη...

Δημοσ.
Ίσως το πρόβλημα να μην είναι από το κομμάτι της php (+mysql). Δοκίμασε αυτό που έγραψε ο spartakoscs. Να κάνεις δηλαδή embed τα ελληνικά fonts στο flash. Όταν κάνεις κλικ σε ένα textfield, στις ιδιότητές του γράφει κάπου Embed. Αν πατήσεις εκεί, επιλέγεις ποια fonts θέλεις να ενσωματωθούν στο flash. Δοκίμασε να βάλεις τα ελληνικά και πες μας αν δούλεψε :)

 

Διορθώνω το μήνυμα, τώρα είδα ότι το έχεις κάνει ήδη...

 

Πλέον το flash λειτουργεί, χάλασαν όλα τα υπόλοιπα....

Δημοσ.

Πρέπει να χωρίσεις το πρόβλημα σου.

 

1. Δες αν η βάση σου και τα tables είναι utf8

 

2. Δες αν τα php files σου είναι utf8 encoded

 

3. Εκτύπωσε το xml σου στον browser. Φαίνονται σωστά τα Ελληνικά με page encoding utf8;

 

4. Φτιάξε ένα xml σαν αυτό που παράγεις με hardcoded τα Ελληνικά μέσα στο XML και φόρτωσέ το στο swf σου. Φαίνονται σωστά;

Δημοσ.
Πρέπει να χωρίσεις το πρόβλημα σου.

 

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 κείμενα

Δημοσ.

Από ότι φαίνεται δεν φταίει λοιπόν το swf σου.

 

Πρέπει να βεβαιωθείς ότι τα πάντα είναι utf8 πριν αρχίσεις να βάζεις data για να μην έχεις τα προβλήματα που έχεις.

 

Μπορείς να αδειάσεις την db σου και να τα ξαναπεράσεις όλα χειροκίνητα (άμα δεν έχεις πολλές εγγραφές) ή μπορείς να φτιάξεις ένα php script και με την Multibyte String και συγκεκριμένα την mb_convert_encoding να μετατρέψεις ότι δεν φαίνεται σωστά από ISO-8859-7 σε UTF-8 και να το ξαναπεράσεις στην βάση.

 

Είναι λίγο μανούρα όλο αυτό αλλά γίνεται.

Δημοσ.
Από ότι φαίνεται δεν φταίει λοιπόν το 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 δε θα δουλέψει...

Δημοσ.

Ναι με ένα loop μπορείς να το κάνεις αλλά πιθανόν θα χρειαστείς και την set_execution_time() να την καλέσεις στην αρχη για να θέσεις ένα μεγάλο execution timeout ώστε να μην πεθάνει το script πριν τελειώσει.

 

Τα files μπορείς από κάποιον editor να τους αλλάξεις το encoding και μετά χειροκίνητα όπου είχες ελληνικά μέσα σε αυτό να τα ξαναπληκτρολογήσεις. Για μαζική αλλαγή δεν γνωρίζω κάποιο tool.

 

Έχεις πολλές εγγραφές στην βάση;

 

Επίσης πριν ξεκινήσεις όλη αυτή την διαδικασία θα σε συμβούλευα να φτιάξεις ένα καινούριο άδειο table και να το γεμίσεις με μερικές εγγραφες οι οποιες θα ειναι utf8 και ΑΦΟΥ έχεις μετατρέψει τα php files σου και να παραγεις το xml σου να δεις ότι όντως αυτό είναι το πρόβλημα.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...