Dikemou Δημοσ. 18 Αυγούστου 2006 Δημοσ. 18 Αυγούστου 2006 Έχουμε το εξής σενάριο σε PHP: > $a = "μπλα"; $b = ... //ελληνικό κείμενο από mysql $b = preg_replace("/(.*)\b(".$a.")(.*)/i", "$1<a>$2</a>$3", $; Το παραπάνω δουλεύει μια χαρά locally στο PC μου, αλλά όχι και στο host μου. Δηλαδή δε βρίσκει match. Τι μπορεί να φταίει; Αν αντικαταστήσω το $b με ελληνικό κείμενο μέσα στο script, τότε δουλεύει οκ, αλλά αν το κείμενο προέρχεται από τη mysql, κωλώνει... To collation των tables είναι utf8_general_ci. Καμιά ιδέα; Τοπικά τρέχω mysql 5.0.18 και php 5.1.1, ενώ ο host τρέχει mysql 5.0.22 και php 5.1.4. Thanx...
alkisg Δημοσ. 19 Αυγούστου 2006 Δημοσ. 19 Αυγούστου 2006 Η php (αντίθετα π.χ. με τη Javascript) εσωτερικά δουλεύει σε ANSI. To UTF-8 του 'μπλα' είναι 'μπλα'. Έτσι, η PHP ψάχνει για 'μπλα' ενώ το κείμενο της mysql περιέχει 'μπλα', και φυσικά δεν το βρίσκει. Μπορείς 1) Να αλλάξεις το collation της MySQL σε greek_general_ci, το οποίο μάλλον δεν το θες, ή 2) Να αποθηκεύσεις το .php αρχείο σαν UTF-8 χωρίς bom. Έτσι, αν και στον editor σου θα βλέπεις $a = "μπλα"; το αρχείο θα περιέχει μέσα $a = "μπλα"; και επομένως θα κάνει match. 3) Να χρησιμοποιήσεις κάποια από τις συναρτήσεις της PHP για να μετατρέψεις το 'μπλα' σε UTF-8 πριν κάνεις το regex. 4) Να χρησιμοποιήσεις κάποια από τις συναρτήσεις της PHP για να μετατρέψεις το κείμενο της MySQL σε iso-8859-7 πριν κάνεις το regex.
Hatman Δημοσ. 19 Αυγούστου 2006 Δημοσ. 19 Αυγούστου 2006 παιζει και να κανεις και το εξης query πριν οτιδηποτε αλλο. sqll="SET NAMES 'GREEK';"; $result=mysql_query($sqll); ..... αυτο θα παιξει αν εχεις mysql 5.
Dikemou Δημοσ. 19 Αυγούστου 2006 Μέλος Δημοσ. 19 Αυγούστου 2006 1. No way! 2. Το δοκίμασα, αλλά μου διάλυσε όλη τη σελίδα (όλα μπλαμπλα) 3. Το είχα δοκιμάσει και δε δούλεψε 4. Το ίδιο Για τα 3 και 4 είχα δοκιμάσει τις utf8_encode() και utf8_decode(), καθώς και κάποιες άλλες (mb_convert_encoding() κτλ). Το περίεργο είναι οτι locally δουλεύει μια χαρά χωρίς κανένα conversion, έχοντας τα ίδια collations κτλ... Hatman, αυτό που λες νομίζω είναι άσχετο με την περίπτωση, ευχαριστώ πάντως... :/
alkisg Δημοσ. 19 Αυγούστου 2006 Δημοσ. 19 Αυγούστου 2006 Εκεί που λες $a = ... και $b = ..., ακριβώς από κάτω γράψ' τα ΜΕΣΩ PHP ΧΩΡΙΣ ΝΑ ΑΝΑΚΑΤΕΨΕΙΣ HTML/BROWSERS κτλ σε ένα αρχείο στο server. Μετά ανέβασε το αρχείο εδώ. Για το (2). Η σελίδα σου τι charset έχει; Δεν έχει utf-8;
PeLLaRaS Δημοσ. 19 Αυγούστου 2006 Δημοσ. 19 Αυγούστου 2006 poli xrisimo gia metatropi apo ena charset se allo: http://phpclasses.solarix.biz/browse/package/1360.html http://www.hotscripts.com/Detailed/37274.html http://mikolajj.republika.pl/ ise sigouros oti sto dio fila3es sosta to php san utf-8 xoris bom? poio editor xrisimopoieis? btw isos o logos pou doulevei locally kai oxi sto server: apo php manual gia strtolower: Επιστρέφει το string με όλους τους αλφαβητικούς χαρακτήρες αλλαγμένους σε μικρούς. Προσέξτε ότι ο όρος 'αλφαβητικός' εξαρτάται από το τρέχων locale. Για παράδειγμα, στο προκαθορισμένο "C" locale, χαρακτήρες όπως ο umlaut-A (Δ) δεν μετατρέπονται. kati paromio mporei na pezei kai gia to preg_replace, an kai den anaferei tpt to manual isos na kita3eis kai gia multi-byte functions (gia utf) isos vreis kati, an kai den iparxei kati paromio se preg_replace
Dikemou Δημοσ. 19 Αυγούστου 2006 Μέλος Δημοσ. 19 Αυγούστου 2006 Η σελίδα έχει iso-8859-7... Τα 'χω μπλέξει, το ξέρω... Το test.txt περιέχει στην πρώτη γραμμή το $a και στη 2η το $b, τα οποία με τον editor μου τα βλέπω μιο χαρά... Pellaras, χρησιμοποιώ UltraEdit, και η αλήθεια είναι οτι δε βλέπω επιλογή σε UTF-8 χωρίς bom. Σκέτο UTF-8 μόνο... Ευχαριστώ και πάλι test.txt
alkisg Δημοσ. 19 Αυγούστου 2006 Δημοσ. 19 Αυγούστου 2006 Στο test.txt, και το $a και το $b είναι σε iso-8859-7, δεν υπάρχει utf-8... Μήπως έγινε καμιά μετατροπή κατά την εγγραφή στο αρχείο; Έχω μια υποψία, κάνε μια δοκιμή. 1) Έναρξη->εκτέλεση->intl.cpl advanced και βάζεις English για τα μη Unicode προγράμματα. Reboot. Πλέον η ansi κωδικοσελίδα των windows σου δεν περιέχει ελληνικά! 2) Ξανατρέχεις το παράδειγμα στον Η/Υ σου. Αν η υποψία μου είναι σωστή, τώρα δεν θα παίζει ούτε στο δικό σου PC!!! (δηλαδή θα αναπαραγάγεις τη συμπεριφορά του server). Αν έτσι καταφέρεις να το αναπαράγεις, αυτό σημαίνει ότι το 'μπλα' η php το θεωρεί 'ěđëá', δηλαδή το αντίστοιχό του στο latin1 locale, και επομένως ψάχνουμε τρόπο να πούμε στην php να θεωρεί ansi locale το iso-8859-7 αντί του latin1 (μάλλον με την setlocale). Προσοχή, όσο θα έχεις English Locale ΜΗΝ πας να κάνεις κανένα check disk ή Defrag κτλ με μη Unicode πρόγραμμα (π.χ. ίσως το disk keeper), θα σου χαλάσει τα ελληνικά ονόματα των Windows. Τα εργαλεία των Windows από την άλλη είναι Unicode, οπότε δεν έχουν πρόβλημα. Αν θες δοκίμασε και μια setlocale με NULL παράμετρο στο PC σου και στον server (για να δεις το τρέχον locale), αν η υπόθεσή μου είναι σωστή θα δείξουν διαφορετικά αποτελέσματα...
Dikemou Δημοσ. 19 Αυγούστου 2006 Μέλος Δημοσ. 19 Αυγούστου 2006 Δεν έκανα εγώ καμία μετατροπή. Δεν ξέρω αν έγινε τίποτα από μόνο του στο server. Χρησιμοποίησα το εξής: >$handle = fopen("test.txt", "w"); fwrite($handle, $a."\n".$; Η setlocale με ως εξής: >echo setlocale(LC_ALL,"")."<br/>"; επιστρέφει "Greek_Greece.1253" στο PC μου και "C" (?!) στο server. To παρακάτω: >setlocale(LC_ALL, "iso-8859-7"); echo setlocale(LC_ALL,"")."<br/>"; επιστρέφει πάλι τις ίδιες τιμές και στα 2 συστήματα. Κάτι που ξέχασα να πω, και ίσως τελικά έχει σημασία: η τιμή της $a λαμβάνεται από το URL με $_GET['a']. Μήπως αυτό παίζει κάποιο ρόλο;;
alkisg Δημοσ. 19 Αυγούστου 2006 Δημοσ. 19 Αυγούστου 2006 Δοκίμασε και με τις παρακάτω εντολές ΠΡΙΝ τη replace: @setlocale(LC_ALL, 'el_GR.ISO8859-7'); define('CHARSET', 'el_GR.ISO8859-7);
Dikemou Δημοσ. 19 Αυγούστου 2006 Μέλος Δημοσ. 19 Αυγούστου 2006 Nope, τα ίδια... κι εξακολουθεί να κάνει echo "C" η setlocale... :/
Hatman Δημοσ. 19 Αυγούστου 2006 Δημοσ. 19 Αυγούστου 2006 ean travas ellnika apo mysql5 database exei megalh sxesh. egw etsi lynw to problhma ayto. dhladh na mou fernei h mysql kinezika enw gw dine ellhnika. prin apo kathe query(insert kai select). Re sy apo to episimo site einai.
PeLLaRaS Δημοσ. 19 Αυγούστου 2006 Δημοσ. 19 Αυγούστου 2006 afou i selida einai se iso-8859-7 giati den exeis to collation se greek_general_ci? an ma ektiposeis kimeno pou perneis apo tin mysql sto server kai oxi apo to pc sou sto dixnei kanonika me iso-8859-7? dokimase na ektiposeis sto server to $a pou perneis: echo $_GET['a'] kai des an sto dixnei kanonika an oxi dokimase to class pou sou ipedi3a prin gia na metatrepseis to charset pou perneis apo $_GET sto idio me tis vasis sou. mporei epidi to locate einai rithmizmeno se c (kai profanos o server den ipostirizei kati allo :-| ) oti dineis sto link me ellinikous xaraktires na kataligei opos pro ipe o alkisg
Dikemou Δημοσ. 31 Αυγούστου 2006 Μέλος Δημοσ. 31 Αυγούστου 2006 Να 'μαι πάλι... Σιγουρεύτηκα οτι το πρόβλημα είναι με την PHP και πιο συγκεκριμένα με τις preg*, σε αντίθεση με τις ereg* που όμως δεν είναι τόσο εύχρηστες. Ο κώδικας και για $word = 'ααα.' (με την τελεία): > echo mb_detect_encoding($word)." 1- ".$word."<br/>"; $word = preg_replace("/\W/", "", $word); echo mb_detect_encoding($word)." 2- ".$word."<br/>"; στο PC μου τυπώνει: > UTF-8 1- ααα. UTF-8 2- ααα Δηλαδή δουλεύει μια χαρά, βγάζοντας την τελεία. Ο ίδιο κώδικας στο server τυπώνει: > UTF-8 1- ααα. ASCII 2- Δηλ, κάπως μετατρέπεται το string από UTF8 σε ASCII, και κάπου εκεί κωλώνει το πράμα... Καμιά ιδέα κανείς;
alkisg Δημοσ. 31 Αυγούστου 2006 Δημοσ. 31 Αυγούστου 2006 Ποια locales είναι installed στον server σου; Κάνε μία system("locale -a") και print τα αποτελέσματα... > ob_start(); system('locale -a'); $str = ob_get_contents(); ob_end_clean();
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.