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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Lecture fichier texte, caractères étranges...

par supercanard » 04 mai 2008, 13:43

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:

par Cyrano » 04 mai 2008, 12:30

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.

par supercanard » 04 mai 2008, 11:47

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:

par Cyrano » 04 mai 2008, 11:06

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...

par supercanard » 04 mai 2008, 10:31

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.

par Myst3ry » 04 mai 2008, 03:01

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?

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

par supercanard » 04 mai 2008, 01:41

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>