Πρόβλημα με php και utf-8

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Άβαταρ μέλους
Khronos
Δημοσιεύσεις: 754
Εγγραφή: 11 Δεκ 2006 14:43
Τοποθεσία: Ηράκλειο

Πρόβλημα με php και utf-8

Δημοσίευση από Khronos » 07 Μάιος 2007 01:45

Γεια σας! Αποφάσισα να αλλάξω το encoding του site μου απο iso-8859-7 σε utf-8.
Οι σελίδες ήταν αποθηκευμένες σε φορμάτ ANSI, οπότε τα ελληνικά φαίνονταν αλαμπουρνέζικα.
Ετσι έσωσα τις σελίδες σε φορμάτ utf-8 για να φαίνονται σωστά τα ελληνικά.
Oμως υπάρχει το εξής πρόβλημα. Σε οσες σελίδες έχω καποια header("location:tade.php")
μου βγάζει το εξής μήνυμα:
Warning: Cannot modify header information - headers already sent by (output started at F:\mypages\search.php:1) in F:\mypages\search.php on line 148

Αν αυτές τις σελίδες τις αποθηκεύσω σε φορμάτ ANSI,δουλεύει μια χαρα αλλά στον editor
τα ελληνικά φαίνονται αλαμπουρνέζικα, ενω στον browser φαίνονται μια χαρά.

Ξέρει κανείς τι συμβαίνει? Πως μπορώ να το διορθώσω? Ευχαριστώ

Άβαταρ μέλους
JimKarvo
Δημοσιεύσεις: 497
Εγγραφή: 23 Ιούλ 2005 17:10
Τοποθεσία: Εξάρχεια!
Επικοινωνία:

Πρόβλημα με php και utf-8

Δημοσίευση από JimKarvo » 07 Μάιος 2007 14:11

το "tade.php" το έχεις σε UTF-8?

Δες λίγο τους κώδικες.. μήπως κάπου γράφεις ansi...

Άβαταρ μέλους
Khronos
Δημοσιεύσεις: 754
Εγγραφή: 11 Δεκ 2006 14:43
Τοποθεσία: Ηράκλειο

Πρόβλημα με php και utf-8

Δημοσίευση από Khronos » 07 Μάιος 2007 15:05

utf-8 ειναι, αλλά και να μην ήταν για ποιο λογο να
χτυπήσει για αυτό κ στο συγκεκριμμενο σημειο?
Δν ξέρω τι γίνεται.

Και κατι αλλο για να μην ανοίξω αλλο θέμα.
Αυτος ο κώδικας ενω δουλευει σε firefox kai i.explorer
σε opera δεν καταστρεφει το cookie. Γιατί?

Κώδικας: Επιλογή όλων

<?php
$past = time&#40;&#41; - 100;
//this makes the time in the past to destroy the cookie
setcookie&#40;ID_my_site, gone, $past&#41;;
setcookie&#40;Key_my_site, gone, $past&#41;;
?>

lakritidis
Δημοσιεύσεις: 401
Εγγραφή: 04 Αύγ 2005 14:35
Τοποθεσία: Katerini
Επικοινωνία:

Πρόβλημα με php και utf-8

Δημοσίευση από lakritidis » 07 Μάιος 2007 18:09

Το μήνυμα σου το εμφανίζει γιατί προσπαθείς να περάσεις δεδομένα στο browser πριν στείλεις τους http headers. Οι headers πρέπει να στέλνονται πριν από οποιαδήποτε άλλη πληροφορία στο browser.
Δες μήπως με την αλλαγή της κωδικοποίησης προστέθηκε πουθενά κάποιος χαρακτήρας που πάει να περάσει πριν την header.

Στη δεύτερη περίπτωση, δοκίμασε να περάσεις και τις υπόλοιπες παραμέτρους της setcookie (domain, secure http only).

Πότε θες να κάνει expire to cookie?

Άβαταρ μέλους
Khronos
Δημοσιεύσεις: 754
Εγγραφή: 11 Δεκ 2006 14:43
Τοποθεσία: Ηράκλειο

Πρόβλημα με php και utf-8

Δημοσίευση από Khronos » 07 Μάιος 2007 20:48

Τα έλεγξα αυτα που μου είπες και οχι, δεν προστέθηκε
κανεις αλλος χαρακτήρας, απλα τα ελληνικα ξανάγραψα
για να φαίνονται σωστά.

Expire κανει το cookie οταν καποιος κανει logout(logout.php)

Αλλά μολις τώρα παρατήρησα οτι το ιδιο error μου βγάζει
οταν κανει καποιος login, kai to error αναφέρεται παλι σε
header και σε αυτα τα 2:
setcookie(ID_my_site, gone, $past);
setcookie(Key_my_site, gone, $past);

Κατα τα αλλα μετα την αλλαγή της κωδικοποίησης τα μονο πραγμα
που επηρεάστηκε ηταν τα ελληνικά.

lakritidis
Δημοσιεύσεις: 401
Εγγραφή: 04 Αύγ 2005 14:35
Τοποθεσία: Katerini
Επικοινωνία:

Πρόβλημα με php και utf-8

Δημοσίευση από lakritidis » 07 Μάιος 2007 21:04

Ναι, γιατί και η cookie περνάει μέσω του http header, όπως και τα sessions. Το σίγουρο είναι ότι πας να περάσεις κάτι στο browser πριν τα headers. Τώρα τι είναι αυτό...

Στον editor που δουλεύεις, ίσως να μη φαίνεται αυτό. Άνοιξε τη σελίδα σου με το σημειωματάριο ή ακόμη πιο σίγουρα με το edit του dos. Ή άλλαξε το extension ενός αρχείου από php σε txt και άνοιξε το με τον mozilla ή τον explorer.

Πιστεύω ότι έχει μπει ένας χαρακτήρας στην κορυφή των αρχείων.

Για το expiration δοκίμασε:

Κώδικας: Επιλογή όλων

setcookie&#40;ID_my_site, gone, -1&#41;;

Άβαταρ μέλους
Khronos
Δημοσιεύσεις: 754
Εγγραφή: 11 Δεκ 2006 14:43
Τοποθεσία: Ηράκλειο

Πρόβλημα με php και utf-8

Δημοσίευση από Khronos » 07 Μάιος 2007 21:37

Εκανα αυτα που είπες αλλα δν βρήκα τπτ.
Αυτος ειναι ο κωδικας του login.php με utf-8 που
βγάζει error.

Κώδικας: Επιλογή όλων

<?php
 
// Connects to your Database 
include 'db.php';
include_once 'common.php';

//Checks if there is a login cookie

if&#40;isset&#40;$_COOKIE&#91;'ID_my_site'&#93;&#41;&#41;

//if there is, it logs you in and directes you to the members page
&#123; 
	$username = $_COOKIE&#91;'ID_my_site'&#93;; 
	$pass = $_COOKIE&#91;'Key_my_site'&#93;;
	
	$check = mysql_query&#40;"SELECT * FROM users WHERE username = '$username'"&#41;or die&#40;mysql_error&#40;&#41;&#41;;

	while&#40;$info = mysql_fetch_array&#40; $check &#41;&#41; 	
		&#123;

		if &#40;$pass != $info&#91;'password'&#93;&#41; 
			&#123;
			
			&#125;

		else
			&#123;
			
			header&#40;"Location&#58; home.php"&#41;;

			&#125;

		&#125;

&#125;

//if the login form is submitted

if &#40;isset&#40;$_POST&#91;'submitok'&#93;&#41;&#41; &#123; // if form has been submitted




	// checks it against the database

	if &#40;!get_magic_quotes_gpc&#40;&#41;&#41; &#123;
		$_POST&#91;'email'&#93; = addslashes&#40;$_POST&#91;'email'&#93;&#41;;
	&#125;

	$check = mysql_query&#40;"SELECT * FROM users WHERE username = '".$_POST&#91;'username'&#93;."'"&#41;or die&#40;mysql_error&#40;&#41;&#41;;

//Gives error if user dosen't exist

$check2 = mysql_num_rows&#40;$check&#41;;
if &#40;$check2 == 0&#41; &#123;
		die&#40;'Αυτός ο χρήστης δεν υπάρχει στη βάση μας. <a href=signup.php>Κάντε κλικ εδώ για εγγραφή</a> ή κάντε κλικ <a href="login.php">εδώ</a> για να κάνετε login ξανά'&#41;;
				&#125;


while&#40;$info = mysql_fetch_array&#40; $check &#41;&#41; 	
&#123;

$_POST&#91;'password'&#93; = stripslashes&#40;$_POST&#91;'password'&#93;&#41;;
	$info&#91;'password'&#93; = stripslashes&#40;$info&#91;'password'&#93;&#41;;
	$_POST&#91;'password'&#93; = $_POST&#91;'password'&#93;;

//gives error if the password is wrong

	if &#40;$_POST&#91;'password'&#93; != $info&#91;'password'&#93;&#41; &#123;
		die&#40;"Λάθος password, παρακαλώ προσπαθήστε ξανά. <a href='login.php'>login</a>"&#41;;
	&#125;

else
&#123;

// if login is ok then we add a cookie 
	
$_POST&#91;'username'&#93; = stripslashes&#40;$_POST&#91;'username'&#93;&#41;;
	

$hour = time&#40;&#41; + 36000000000000000; 
setcookie&#40;ID_my_site, $_POST&#91;'username'&#93;, $hour&#41;;
setcookie&#40;Key_my_site, $_POST&#91;'password'&#93;, $hour&#41;;	


//then redirect them to the members area

header&#40;"Location&#58; home.php"&#41;;
&#125;

&#125;

&#125; else &#123;	

// if they are not logged in
?>


<html>
<head><title>Είσοδος</title>
<link rel="stylesheet" type="text/css" href="mycss.css">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Language" content="el">

<script language="javascript">
	function check_values&#40;&#41; &#123;
		if &#40;document.loginform.username.value.length == 0&#41; &#123;
			alert&#40;"Παρακαλώ συμπληρώστε το username"&#41;;
			return false;
		&#125; else if &#40;document.loginform.password.value.length == 0&#41; &#123;
			alert&#40;"Παρακαλώ συμπληρώστε το password"&#41;;
			return false;
		&#125; 
		return true;
	&#125;
</script>

</head>
<body>

<div id="container">
<div id="container2">

<?php require&#40;"includes/head.php"&#41;; ?>


<?php require&#40;"includes/leftmenu.php"&#41;; ?>

<?php require&#40;"includes/rightnav.html"&#41;; ?>


<div id="content">
<br />

<div id="loginform" align="center">

<form action="<?php echo $_SERVER&#91;'PHP_SELF'&#93;?>" method="post" name="loginform" onsubmit="return check_values&#40;&#41;">
<table border="0" class="login">
<tr><td colspan=2><h4 align="center" class="members">Είσοδος</h4></td></tr>
<tr><td class="login">Username&#58;</td><td>
<input type="text" name="username" maxlength="40">
</td></tr>
<tr><td class="login">Password&#58;</td><td>
<input type="password" name="password" maxlength="50">
</td></tr>
<tr><td class="login" colspan="2" align="center">
<input type="submit" name="submitok" value="Είσοδος">
</td></tr>
</table>
</form>
</div>


</div>



<?php require&#40;"includes/foot.html"&#41;;  ?>

</div>
</div>

</body>
</html>

<?php
&#125;

?>

Οταν το κανω ANSI δουλευει μια χαρα.

lakritidis
Δημοσιεύσεις: 401
Εγγραφή: 04 Αύγ 2005 14:35
Τοποθεσία: Katerini
Επικοινωνία:

Πρόβλημα με php και utf-8

Δημοσίευση από lakritidis » 07 Μάιος 2007 21:43

Υπάρχει ένα enter πάνω πάνω στην πρώτη γραμμή.
Ανέβασε το

Κώδικας: Επιλογή όλων

<?php
πάνω-πανω και ξαναδοκίμασε.

Άβαταρ μέλους
Khronos
Δημοσιεύσεις: 754
Εγγραφή: 11 Δεκ 2006 14:43
Τοποθεσία: Ηράκλειο

Πρόβλημα με php και utf-8

Δημοσίευση από Khronos » 07 Μάιος 2007 21:56

To enter ειναι απο τα code tags.

Δεν ξέρω, αν δεν βρεθεί λύση μαλλον θα τα ξαναγυρίσω
σε ANSI kai iso-8859-7

lakritidis
Δημοσιεύσεις: 401
Εγγραφή: 04 Αύγ 2005 14:35
Τοποθεσία: Katerini
Επικοινωνία:

Πρόβλημα με php και utf-8

Δημοσίευση από lakritidis » 07 Μάιος 2007 21:58

Τελευταία λύση:

Γύρνα σε ANSI, άσε το utf-8 encoding στις meta-tags και βαλε πάνω-πάνω:

Κώδικας: Επιλογή όλων

header&#40;'Content-type&#58; text/html; charset=utf-8'&#41;;

Άβαταρ μέλους
Khronos
Δημοσιεύσεις: 754
Εγγραφή: 11 Δεκ 2006 14:43
Τοποθεσία: Ηράκλειο

Πρόβλημα με php και utf-8

Δημοσίευση από Khronos » 07 Μάιος 2007 22:06

Το θέμα είναι οτι σε ANSI δουλευει μια χαρα χωρίς να
προσθέσω τη γραμμή που λες, απλα στον editor δεν
φαίνονται σωστά τα ελληνικά.

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Πρόβλημα με php και utf-8

Δημοσίευση από cpulse » 07 Μάιος 2007 23:28

Όταν σώζεις σε utf-8 με το notepad των windows, σου βάζει στην αρχή 3 χαρακτήρες που θυμίζουν στο notepad οτι το περιεχόμενο που ακολουθεί είναι σε utf-8. Συγκεκριμένα αυτοί οι χαρακτήρες είναι οι 0xef 0xbb 0xbf και μπορείς να ψάξεις περισσότερα γι αυτούς σαν byte order mark.

Αυτοί οι χαρακτήρες κάνουν output πριν το <?php, γι αυτό έχεις αυτά τα προβλήματα. Οι λύσεις είναι 1) Να το σώσεις σαν utf-8 από άλλο editor, 2) να το σώσεις σαν ansi και να κάνεις include το utf-8 αρχείο, μετά από το header() session_start() ή setcookie(), 3) να βάλεις σε ξεχωριστό αρχείο το language resource file και το κεντρικό να είναι σε ansi.

Άβαταρ μέλους
Khronos
Δημοσιεύσεις: 754
Εγγραφή: 11 Δεκ 2006 14:43
Τοποθεσία: Ηράκλειο

Πρόβλημα με php και utf-8

Δημοσίευση από Khronos » 07 Μάιος 2007 23:45

To notepad++ χρησιμοποιώ οποτε δν πιστευω να ισχύει
αυτο με τους 3 χαρακτήρες.

Αξίζει την ταλαιπωρία το utf-8? Mou προσφέρει κάτι
παραπάνω απο το iso-8859-7?

Σας ευχαριστώ για τις απαντήσεις σας

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Πρόβλημα με php και utf-8

Δημοσίευση από cpulse » 08 Μάιος 2007 00:32

Με το Notepad++ πήγαινε στο menu > Plugins > HEX-Editor > View in HEX και θα δεις κατευθείαν τι γίνεται.

Ανάλογα την περίπτωση αξίζει ή όχι. Σε γενικές γραμμές κατά την γνώμη μου αξίζει. Είναι μακροχρόνια ευέλικτο σύστημα γιατί μπορείς να βάλεις κι άλλες γλώσσες και να μην παιδεύεσαι με τη μορφή της βάσης.

Άβαταρ μέλους
Khronos
Δημοσιεύσεις: 754
Εγγραφή: 11 Δεκ 2006 14:43
Τοποθεσία: Ηράκλειο

Πρόβλημα με php και utf-8

Δημοσίευση από Khronos » 08 Μάιος 2007 01:13

Οντως εμφανίζονται κατι χαρακτήρες στο ΗΕΧ, αλλα
μολις πάω να τους σβήσω αλλάζει απο μόνο του το
φορμάτ σε ANSI. Και μολις το ξανακάνω utf-8 ξαναβάζει
τους χαρακτήρες.

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες