lepass_7 Δημοσ. 11 Ιανουαρίου 2009 Δημοσ. 11 Ιανουαρίου 2009 Γεια σας παιδία, έφτιαξα μια απλή φόρμα(html) που περνει το όνομα τηλέφωνο email και το κυρίως θέμα και χρησιμοποιώντας php στέλνει τα στοιχεια στο email μου. Το πρόβλημα είναι τα ελληνικά, δηλάδη αν κάποιος γράψει με ελλήνικους χαρακτηρές τα πιο πάνω όταν παίρνω το email οι χαρακτήρες που μου βγάζει είναι αστα να πάνε.... ο κώδικας είναι: <?php if(array_key_exists('send', $_POST)){ $to='ΤΟ EMAIL ΜΟΥ'; $subject='Μήνυμα από ιστοσελίδα'; $name=$_POST['name']; $email=$_POST['email']; $tel=$_POST['tel']; $info=$_POST['info']; $message="Όνομα: $name\n\n"; $message.="Email αποστολέα: $email\n\n"; $message.="Τηλέφωνο: $tel\n\n"; $message.="Θέμα: \n $info"; $message=wordwrap($message, 500); $mailsent=mail($to, $subject, $message); } ?> Υπάρχει κάποιος τρόπος να το διορθώσω; ευχαριστώ
nske Δημοσ. 11 Ιανουαρίου 2009 Δημοσ. 11 Ιανουαρίου 2009 Οι χαρακτήρες μπορεί να αντιπροσωπεύονται ψηφιακά με διάφορα character encoding sets (2ο link). Τα παραδοσιακά έχουν χωρητικότητα 1 byte (δηλαδή υπάρχουν τόσοι διαφορετικοί χαρακτήρες όσοι πιθανοί συνδυασμοί bits σε ένα byte, 256), οπότε δεν χωράνε όλους τους χαρακτήρες όλων των γλωσσών. Από (standardized) single byte encodings, Ελληνικά περιέχει η iso-8859-7. Πλέον όμως υπάρχει μια προσπάθεια ενοποίησης όλων των χαρακτήρων παγκοσμίως σε έναν πίνακα, το Unicode. Το Unicode έχει διάφορες υλοποιήσεις character encoding sets, αυτό που έχει επικρατήσει είναι το UTF-8 το οποίο έχει μεταβλητή χωρητικότητα 1-4 bytes (στη συγκεκριμένη ο κάθε ASCII χαρακτήρας καταναλώνει 1 byte και ο κάθε ελληνικός 2 bytes). Τώρα στο πρόβλημα: Όταν ο browser ανοίγει μια σελίδα, πρέπει να γνωρίζει ποια κωδικοποίηση να χρησιμοποιήσει για να ερμηνεύσει τους χαρακτήρες και για να στείλει χαρακτήρες. Αυτό μπορεί: 1) Να το βάλει ο χρήστης "καρφωτά" στον browser ως default ή ως υποχρεωτικό 2) Να το βάλει ο διαχειριστής του http server ως default ή ως υποχρεωτικό 3) Να το βάλει ο web developer στο <head> της html του όπως περιγράφεται εδώ. Προφανώς η σωστή λύση η οποία θα παίξει σίγουρα αν δεν είναι κακορυθμισμένος ο server και ο client είναι το 3. Λογικά αρκεί να ορίσεις στο <head> της σελίδας:><meta http-equiv="Content-Type" content="text/html; charset=utf-8"> Όμως απ' όσο ξέρω η PHP δεν έχει κανονική υποστήριξη για Unicode, που σημαίνει ότι, αν δε θέλεις τα strings σου να αντιμετωπιστούν απλά ως ανόητες σειρές από bytes, όπως δε θέλεις στην mail, θα πρέπει να κάνεις μετατροπές ή να χρησιμοποιήσεις κάποιες έτοιμες "unicode-friendly" συναρτήσεις, αν υπάρχουν. Τροποποίησε το php.ini σου, στο section [mbstring] ως εξής: >[mbstring] mbstring.language = Neutral mbstring.internal_encoding = UTF-8 mbstring.http_input = UTF-8 mbstring.http_output = UTF-8 mbstring.encoding_translation = On mbstring.detect_order = auto mbstring.substitute_character = long; (αυτά μπορείς να τα περάσεις και από το script σου, αν δεν έχεις πρόσβαση στο php.ini) Τροποποίησε το script σου ώστε να χρησιμοποιεί την mb_send_mail() αντί της mail() και πρέπει να είσαι εντάξει.
lepass_7 Δημοσ. 11 Ιανουαρίου 2009 Μέλος Δημοσ. 11 Ιανουαρίου 2009 Οι χαρακτήρες μπορεί να αντιπροσωπεύονται ψηφιακά με διάφορα character encoding sets (2ο link). Τα παραδοσιακά έχουν χωρητικότητα 1 byte (δηλαδή υπάρχουν τόσοι διαφορετικοί χαρακτήρες όσοι πιθανοί συνδυασμοί bits σε ένα byte, 256), οπότε δεν χωράνε όλους τους χαρακτήρες όλων των γλωσσών. Από (standardized) single byte encodings, Ελληνικά περιέχει η iso-8859-7. Πλέον όμως υπάρχει μια προσπάθεια ενοποίησης όλων των χαρακτήρων παγκοσμίως σε έναν πίνακα, το Unicode. Το Unicode έχει διάφορες υλοποιήσεις character encoding sets, αυτό που έχει επικρατήσει είναι το UTF-8 το οποίο έχει μεταβλητή χωρητικότητα 1-4 bytes (στη συγκεκριμένη ο κάθε ASCII χαρακτήρας καταναλώνει 1 byte και ο κάθε ελληνικός 2 bytes). Τώρα στο πρόβλημα: Όταν ο browser ανοίγει μια σελίδα, πρέπει να γνωρίζει ποια κωδικοποίηση να χρησιμοποιήσει για να ερμηνεύσει τους χαρακτήρες και για να στείλει χαρακτήρες. Αυτό μπορεί: 1) Να το βάλει ο χρήστης "καρφωτά" στον browser ως default ή ως υποχρεωτικό 2) Να το βάλει ο διαχειριστής του http server ως default ή ως υποχρεωτικό 3) Να το βάλει ο web developer στο <head> της html του όπως περιγράφεται εδώ. Προφανώς η σωστή λύση η οποία θα παίξει σίγουρα αν δεν είναι κακορυθμισμένος ο server και ο client είναι το 3. Λογικά αρκεί να ορίσεις στο <head> της σελίδας:><meta http-equiv="Content-Type" content="text/html; charset=utf-8"> Όμως απ' όσο ξέρω η PHP δεν έχει κανονική υποστήριξη για Unicode, που σημαίνει ότι, αν δε θέλεις τα strings σου να αντιμετωπιστούν απλά ως ανόητες σειρές από bytes, όπως δε θέλεις στην mail, θα πρέπει να κάνεις μετατροπές ή να χρησιμοποιήσεις κάποιες έτοιμες "unicode-friendly" συναρτήσεις, αν υπάρχουν. Τροποποίησε το php.ini σου, στο section [mbstring] ως εξής: >[mbstring] mbstring.language = Neutral mbstring.internal_encoding = UTF-8 mbstring.http_input = UTF-8 mbstring.http_output = UTF-8 mbstring.encoding_translation = On mbstring.detect_order = auto mbstring.substitute_character = long; (αυτά μπορείς να τα περάσεις και από το script σου, αν δεν έχεις πρόσβαση στο php.ini) Τροποποίησε το script σου ώστε να χρησιμοποιεί την mb_send_mail() αντί της mail() και πρέπει να είσαι εντάξει. Ευχαριστώ για την απάντηση. Την συνάρτηση που λες την mb_send_mail() την έχω χρησιμοποιήση και πάλι το email ποου πήρα δεν ήταν το επιθυμητό, αυτό έγινε χωρίς όμως να τροποποιήσω το php.ini. Μπορώ να τροποποιησώ το mbstring χρησιμοποιώντας την php?
nske Δημοσ. 11 Ιανουαρίου 2009 Δημοσ. 11 Ιανουαρίου 2009 Μπορείς να χρησιμοποιήσεις την mb_language() αντί να το ορίσεις στο php.ini. Δοκίμασε όπως αναφέρει στα παραδείγματα: >mb_language("uni"); $body = chunk_split(base64_encode($content)); mb_send_mail("[email protected]", "Subject", $body); (το περιεχόμενο του μηνύματος είναι στην $content)
lepass_7 Δημοσ. 11 Ιανουαρίου 2009 Μέλος Δημοσ. 11 Ιανουαρίου 2009 Έκανα ότι μου είπες: <?php $content='ρε φιλε'; mb_language("uni"); $body = chunk_split(base64_encode($content)); mb_send_mail("To email μου", "Subject", $body); ?> Και στο email πήρα αυτό: z4HOtSDPhs65zrvOtQ== -----Προστέθηκε 11/1/2009 στις 11 : 08 : 36----- Είχα ξεχάσει να αλλάξω την κωδικοποιήση της σελιδάς, αλλά πάλι τώρα που την άλλαξα: <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-7" /> Πάλι παίρνω αυτό: 8eUg9unr5Q== Τ λες; Κάνω κάτι λάθος;
nske Δημοσ. 11 Ιανουαρίου 2009 Δημοσ. 11 Ιανουαρίου 2009 Χμ, νόμιζα ότι η mb_send_mail δεν κάνει αυτόματα encode σε base64 αλλά τακτοποιεί αυτόματα τους headers. Τώρα που το δοκίμασα βλέπω το αντίθετο Εν πάσι περιπτώσει, δοκίμασα το εξής και δουλεύει: >$charset='UTF-8'; $subject='Ελληνικοί Χαρακτήρες;'; $encoded_subject="=?$charset?B?".base64_encode($subject)."?=\n"; $to="[email protected]"; $body='τεστ;'; $headers="From: ".$from."\n" . "Content-Type: text/plain; charset=$charset; format=flowed\n" . "MIME-Version: 1.0\n" . "Content-Transfer-Encoding: 8bit\n" . "X-Mailer: PHP\n"; mail($to,$encoded_subject, $body,$headers);
lepass_7 Δημοσ. 11 Ιανουαρίου 2009 Μέλος Δημοσ. 11 Ιανουαρίου 2009 Ελα ρε φίλε ευχαριστώ, τώρα μπηκα στο site να γράψω και έγω γιατί βρήκα την λύση και δουλεύει, θα δοκιμάσω και το δικό σου(στην ουσία τα ίδια κάναμε). Αυτό που δούλεψε σε εμένα είναι > <?php if(array_key_exists('send', $_POST)){ $to='To email μου'; //$subject='Μήνυμα από ιστοσελίδα'; $name=$_POST['name']; $email=$_POST['email']; $tel=$_POST['tel']; $info=$_POST['info']; //encoding settings [color="Red"]$headers = 'MIME-Version: 1.0' . "\r\n"; $headers .= 'Content-type: text/html; charset=utf-8' . "\r\n"; $headers .= 'From: Webmaster <[email protected]>' . "\r\n"; $subject = '=?utf-8?b?' . base64_encode(iconv('iso-8859-7', 'utf-8', 'Μήνυμα από ιστοσελίδα!')) . '?=';[/color] //checking $message="Όνομα: $name\n\n"; $message.="Email αποστολέα: $email\n\n"; $message.="Τηλέφωνο: $tel\n\n"; $message.="Θέμα: \n $info"; $mailsent=mail($to, $subject, $message); } ?> Ευχαριστώ για τον χρόνο σου
stelios87 Δημοσ. 1 Νοεμβρίου 2010 Δημοσ. 1 Νοεμβρίου 2010 Good job! Επιτέλους δουλεύει και στο in.gr mail provider!
gtroza Δημοσ. 2 Νοεμβρίου 2010 Δημοσ. 2 Νοεμβρίου 2010 άμα το πεί ο nske τότε γίνεται nske ευχαριστούμε γιά τις "διδακτικές" απαντήσεις! gtrozux .
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.