Page 1 sur 1

Lecture fichier texte, caractères étranges...

Posté : 04 mai 2008, 01:41
par supercanard
Bonsoir

J'ai un étrange problème lorsque je veut mettre à jour un fichier texte, ou plutôt un fichier css, mais je pense que le format n'y ais pour rien :

La mise à jour se fait via un textarea. Dès que je fait un retour charriot, il est bien pris en compte puisque lorsque j'ouvre le fichier pas de problèmes... mais lorsque je le recharge dans le textarea j'obtiens des caractères ressemblant à un carré/rond avec un ? dedans : �

Un peu de code... ? :
if ( $_POST['yo'] )
{
$nouvelles_donnees = $_POST['yo'];
//On ouvre le fichier "mon_fichier.txt" en mode "lecture et écriture"
$file = fopen('../utilisateur/test.css', 'r+');
//On récupère les données dans le fichier
$donnees =  fgets($file,4096);
//On vide le fichier de son contenu
ftruncate($file, 0);
//Et on écrit le nouveau contenu
fwrite($file, $nouvelles_donnees);
//Fermeture du fichier
fclose($file);
}

//On ouvre le fichier "mon_fichier.txt" en mode "lecture seule"
$fd = fopen('../utilisateur/test.css', 'r');
$i=1; // compteur de ligne
// Lorsque nous atteindrons la fin du fichier
// foef($fd) retournera faux
// et la boucle while s'arrêtera
while (!feof($fd)) {
// Il est temps de lire une ligne du fichier
// et en tout cas au maximum 1024 caractères
$ligne = fgets($fd, 1024);
// Si la fin du fichier n'est pas atteinte
// On peut maintenant afficher la ligne
if (!feof($fd)) $donnees .= $ligne;
$i++;
}
// On a fini, on ferme !!
fclose($fd);
?>
<form method="post" action="test.php">
<textarea name="yo"><?php echo  $donnees; ?></textarea>
<input type="submit" value="Enregistrer" />
</form>

Posté : 04 mai 2008, 03:01
par Myst3ry
Ouai, C'est un problème de caractère Spéciaux.

Malheureusement il se produit très souvent. Il faut que tu t'assure d'utiliser le même "CHARSET" dans ta page et dans ta base de donné. Sinon il se produit un conflit et les caract`re spéciaux s'affiche avec des ? ou des carré. Quelle "Charset" utilise tu?

Posté : 04 mai 2008, 10:31
par supercanard
Salut

Mais la il ya pas du tout de communication avec la base de donnée en fait.
J'enregistre et je lis dans un fichier .css
J'utilise le même charset partout.

Posté : 04 mai 2008, 11:06
par Cyrano
Quel encodage as-tu indiqué dans tes en-tête HTML ? utf-8 ou iso-8859-1 ? Si tu encodes-tout en iso-859-1 et que tu mets un charset utf8, c'est ce que tu vas obtenir. À moins qu'il n'y ait rien d'indiqué dans l'en-tête et que ton navigateur utilise l'utf8 par défaut...

Posté : 04 mai 2008, 11:47
par supercanard
Quel encodage as-tu indiqué dans tes en-tête HTML ? utf-8 ou iso-8859-1 ? Si tu encodes-tout en iso-859-1 et que tu mets un charset utf8, c'est ce que tu vas obtenir. À moins qu'il n'y ait rien d'indiqué dans l'en-tête et que ton navigateur utilise l'utf8 par défaut...
Alors le fichier contenant le textarea est de l'iso.
Le fichier dans lequel j'écris n'a pas de charset puisque il est vide ou contient du texte.
Mais le problème ne se passe pas forcément sur les caractères. Des fois tout ce que j'ai écrit est bien là, mais entre mes mots j'ai ces espaces byzar qui apparaissent dans le textarea mais qui ne sont pas présent dans le fichier.
Il n'y a pas un rapport avec les retours à la ligne aussi ? :roll:

Posté : 04 mai 2008, 12:30
par Cyrano
Je me suis livré à quelques tests et en fait il y a plusieurs problèmes :
- le mode choisi pour l'ouverture n'est pas approprié : "w+" est préférable : du coup, plus besoin d'utiliser ftruncate()
- Au lieu de lire ligne par ligne, tu peux lire le fichier complet.
Voici ce que j'ai fait (adapte le chemin vers le fichier au besoin pour tester, début du code)
<?php
// $fichier = '../utilisateur/test.css';
$fichier = './test.css';
$donnees = '';
if (isset($_POST['yo']))
{
    // On vide les statistiques précédentes sur le fichier
    clearstatcache();
    // On récupère la taille du fichier s'il existe
    $iTaille = (file_exists($fichier)) ? filesize($fichier) : 0;
    $nouvelles_donnees = $_POST['yo'];
    // On ouvre le fichier "mon_fichier.txt" en mode "lecture et écriture" : le mode "w+" va vider le contenu avant d'écrire
    $file = fopen($fichier, 'w+');
    // On récupère les données dans le fichier s'il existe (défini plus haut)
    $donnees = ($iTaille > 0) ? fread($file, $iTaille) : '';
    // On écrit le nouveau contenu
    fwrite($file, $nouvelles_donnees);
    //Fermeture du fichier
    fclose($file);
}

//On ouvre le fichier "mon_fichier.txt" en mode "lecture seule"
if(file_exists($fichier))
{
    $fd = fopen($fichier, 'r');
    $i = 1; // compteur de ligne
    // Lorsque nous atteindrons la fin du fichier
    // foef($fd) retournera faux
    // et la boucle while s'arrêtera
    while (!feof($fd))
    {
        // Il est temps de lire une ligne du fichier
        // et en tout cas au maximum 1024 caractères
        $ligne = fgets($fd, 1024);
        // Si la fin du fichier n'est pas atteinte
        // On peut maintenant afficher la ligne
        if (!feof($fd))
        {
            $donnees .= $ligne;
        }
        $i++;
    }
    // On a fini, on ferme !!
    fclose($fd);
}
echo("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" xml:lang="fr" />
    <title>Ecriture d'un fichier CSS</title>
<?php
if(file_exists($fichier))
{
?>
    <link rel="stylesheet" type="text/css" href="<?php echo($fichier); ?>" />
<?php
}
?>
  </head>
  <body>
    <form method="post" action="<?php echo($_SERVER['PHP_SELF']); ?>">
      <fieldset>
        <textarea name="yo" cols="100" rows="20"><?php echo $donnees; ?></textarea>
        <input type="submit" value="Enregistrer" />
      </fieldset>
    </form>
  </body>
</html>
J'ai adapté les commentaires, vérifie chaque ligne.

Posté : 04 mai 2008, 13:43
par supercanard
Ah merci c'est génialement sympa.
En plus avec cette version ou tu test si le fichier existe, on peut facilement rajouter quelques lignes pour créer le fichier s'il n'existe pas.
Merci pour les commentaires sur le code ça aide à comprendre :wink: