IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Manipulation de chaine de caractères avec \n


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Par défaut Manipulation de chaine de caractères avec \n
    Bonjour,

    Dans mon code html/php, je passais à une fonction php une chaine de caractères avec des \n pour figurer un saut de ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php 
    function display_tableau($texte_image)
    {
        $texte = "$texte_image";
        print '<h4>' . nl2br(htmlspecialchars($texte)) . '</h4>';
    ...
    ?>
    ...
    <?php 
    display_tableau("Acrylique sur toile\n2023\n40x40");
    ?>
    Dans ma page HTML, s'affichait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Acrylique sur toile
    2023
    40x40
    A présent, je lis le texte à partir d'un fichier texte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            $fic = fopen($fichier, 'rb');
     
            while($tab=fgetcsv($fic,1024,',')) {
                  ...
                  $texte = $tab[3];
                  print '<figure class="row">';
                  print '  <figcaption>';
                  print '<h4>' . nl2br(htmlspecialchars($texte)) . '</h4>';
             ...
    Dans ma page HTML, s'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Acrylique sur toile\n2023\n40x40
    Qu'est ce qui fait que le comportement soit modifié?
    Merci

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 322
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 322
    Billets dans le blog
    17
    Par défaut
    Il faut voir comment sont codés les retours à la ligne dans ton CSV.

  3. #3
    Membre éprouvé Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Par défaut
    Comment je vois cela?
    Mon csv est un fichier texte non issu d'un outil : ce sont seulement des champs séparés par une ','.
    Donc, je ne pense pas qu'il y ait d'encodage : \n corresponds aux deux caractères \ et n , non? Rien trouvé sur le net.
    Merci

  4. #4
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Un fichier texte ou csv (qui est un fichier texte) contient du texte brut donc un antislash suivi d'un n est un antislash suivi d'un n et ne représente rien d'autre. Par contre dans une chaîne définie entre double-quotes en PHP, la séquence \n est interprétée comme étant un saut de ligne.
    Donc si tu veux un saut de ligne dans un fichier texte, il faut aller à la ligne et c'est tout!

    Dans un csv, il y a une subtilité supplémentaire à prendre en compte: le saut de ligne est le séparateur d'enregistrements. Donc pour figurer un saut de ligne dans une colonne, celle-ci doit-être protégée par des quotes. Par exemple:
    Code txt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    11,machin,truc,pastel,1985,5
    12,toto,pouet,"Acrylique sur toile
    2023
    40x40",1984,12
    13,bidule,bip,gouache,1992,4

  5. #5
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 322
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 322
    Billets dans le blog
    17
    Par défaut
    \n corresponds aux deux caractères \ et n , non?
    En conséquence de quoi ce ne sont plus des retours à la ligne, mais de simples littéraux.

    Le retour à la ligne \n représente un caractère bien particulier, le LINE-FEED => 0x0A (LF)

    Par contre le texte en toute lettre '\n' n'est rien d'autre que la suite d'octets 0x5C (pour \) et 0x6E (pour n) et n'a plus rien à voir avec un retour à la ligne.

    Il faut revoir le codage de ton CSV.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Par défaut
    It's important to remember that this function does NOT replace newlines with <br> tags. Rather, it inserts a <br> tag before each newline, but it still preserves the newlines themselves!
    Source: https://www.php.net/manual/en/function.nl2br.php

  7. #7
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    C'est vrai que le coté "droit au but" (right to the point) de l'anglais manque cruellement sur cette page du manuel PHP dans la version française où l'on a traduit "before all newlines" par "à chaque nouvelle ligne" (du coup on ignore si <br /> est inséré avant ou aprés). De plus le nom de la fonction laisse supposer qu'il y a remplacement et non insertion d'où la pertinence du commentaire de CGameProgrammer at gmail dot com.

    D'autre part, je trouve particulièrement curieux que cette fontion considère que \n\r est une séquence de saut de ligne. Je ne doute pas que celle-ci existe sur je ne sais quel OS (Acorn BBC, RISC OS), mais si tel est le cas, celle-ci est quand même sacrément exotique. (ceci étant dit, pour une imprimante matricielle, \r\n ou \n\r ça ne change rien). Et pourquoi pas x85 NEL (Next Line), le saut du ligne de l'OS400!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Dégradé sur une chaine de caractères avec 3 a 4 couleurs
    Par avogadro dans le forum Composants VCL
    Réponses: 6
    Dernier message: 31/03/2006, 13h21
  2. Reception chaine de caractère avec recvfrom()
    Par innosang dans le forum C
    Réponses: 5
    Dernier message: 31/12/2005, 14h51
  3. Lecture d'une chaine de caractère avec fgets
    Par mayoouketchup dans le forum Langage
    Réponses: 9
    Dernier message: 22/12/2005, 16h17
  4. Réponses: 4
    Dernier message: 20/08/2004, 10h59
  5. Réponses: 2
    Dernier message: 06/12/2002, 07h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo