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 :

(float) $myString toujours à 0 dû au codage du fichier lu


Sujet :

Langage PHP

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 874
    Points : 371
    Points
    371
    Par défaut (float) $myString toujours à 0 dû au codage du fichier lu
    Bonjour à tous
    Je deviens fou !
    Voici un code lisant un fichier "texte" pour lequel, je veux convertir des strings en float. Après moultes essais, le (float)$MyString renvoie toujours 0 (zéros) pour certains fichiers.
    Par exemple, si l'on affiche le fichier via l'URL https://visiolittoral.fr/Traces/Trac...ebe4d28%7D.txt
    on voit tout de suite la présence de losanges noir avec points d’interrogation.
    Notez que ce fichier s'affiche correctement dans un notepad++ (par contre, aucun encodage n'est sélectionné dans l'onglet "Encodage").
    Avec des fichiers UTF8, aucun problème.
    Si j'ajoute des echo, vardump... les chaines (des coordonnées en l’occurrence) sont correctement affichées.
    Comment :
    - détecter/ouvrir ce type de fichier ?
    - connaitre l'encodage ?
    - arriver à convertir les chaines ?


    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
      class Coord
                        {
                            public $long;
                            public $lat;
                        }
    $inT=fopen("Traces/".$row["filename"],"r");		
    	    while (!feof($inT)) 
                {
                    $bufferT=fgets($inT);
                    if ($bufferT===null or $bufferT===false or $bufferT=="" or strlen($bufferT)<=1) 
                    {
                    }
                else
                {
                        list($Long,$Lat)=Get_Positions($bufferT);
                        $coord = new Coord();
                        $coord->long = $Long;
                        $coord->lat = $Lat;
                        $Positions[]=$coord;
                    }
            }
            fclose($inT);
    function Get_Positions($LIGNE)
    {
        $Long="";
        $Lat="";
    $Direction="";
        list($Long,$Lat,$Direction)=explode(';', $LIGNE);
         return [(float)$Long,(float)$Lat];
      }

  2. #2
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 429
    Points
    429
    Par défaut
    Bonjour,

    Il me semble que $row["filename"] ne donne que le nom du fichier, sans son extension .txt

  3. #3
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 252
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 252
    Points : 8 542
    Points
    8 542
    Billets dans le blog
    17
    Par défaut
    Par exemple, si l'on affiche le fichier via l'URL https://visiolittoral.fr/Traces/Trac...ebe4d28%7D.txt
    on voit tout de suite la présence de losanges noir avec points d’interrogation.
    Je n'ai pas ceci, sans doute car mon éditeur (Notepad Windows) détecte correctement le codage. Ici UTF-16 LE.
    On peut aussi déterminer le codage en visualisant la représentation hexadécimale du fichier, par exemple en l'ouvrant avec l'excellent https://hexed.it/ on voit que les caractères sont tous codés sur 2 octets.
    Nom : hexedit.png
Affichages : 40
Taille : 112,6 Ko

    Comment :
    - détecter/ouvrir ce type de fichier ?
    - connaitre l'encodage ?
    Détecter/connaître : mb_detect_encoding(), mais ce n'est pas une solution miracle
    Ouvrir : fopen(), mais PHP gère mal le multi-octet, il faut donc préparer les données "manuellement"

    - arriver à convertir les chaines ?
    Voir les fonctions mb_* ou iconv_*

    Exemple sans utiliser l'horreur feof() et avec fgetcsv() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <?php
     
    $file = 'https://visiolittoral.fr/Traces/Trace_{e05b27fe-67db-492a-8dd1-95274ebe4d28}.txt';
    $contents = file_get_contents($file);
    $contents = mb_convert_encoding($contents, 'UTF-8', 'UTF-16LE'); // Conversion du fichier de UTF-16LE vers UTF-8, sans ça nous aurions des \x00 qui trainent partout
     
    $stream = fopen('php://memory', 'r+'); // Pour la lecture CSV
    fwrite($stream, $contents);
    rewind($stream);
     
    $csv_options = ['separator' => ';', 'enclosure' => '"', 'escape' => ''];
     
    while ($row = fgetcsv($stream, ...$csv_options)) {
        if (count($row) !== 3) { // Parce que ton fichier a une ligne finale vide...
            continue;
        }
        $row[0] = (float)$row[0]; // Conversion longitude en float
        $row[1] = (float)$row[1]; // Conversion latitude en float
        print_r($row);
    }
    Donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    Array
    (
        [0] => -0.694671
        [1] => 49.345062
        [2] => N/A
    )
    Array
    (
        [0] => -0.694673
        [1] => 49.345072
        [2] => N/A
    )
    Array
    (
        [0] => -0.694673
        [1] => 49.34509
        [2] => N/A
    )
    Array
    (
        [0] => -0.694672
        [1] => 49.3451
        [2] => N/A
    )
    Array
    (
        [0] => -0.694671
        [1] => 49.345112
        [2] => N/A
    )
    ...

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 874
    Points : 371
    Points
    371
    Par défaut
    Salut Séb
    J'ai utiliser $bufferTUTF8 =mb_convert_encoding($bufferT, 'UTF-8', 'UTF-16BE'); et ça fonctionne bien.
    Par contre, j'utilise bien la dernière version de notepad++ sous Windows mais comment vois-tu que le codage est UTF 16 ? Nom : Sans titre-1.fw.png
Affichages : 36
Taille : 333,9 Ko

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 252
    Points : 8 542
    Points
    8 542
    Billets dans le blog
    17
    Par défaut
    j'utilise bien la dernière version de notepad++ sous Windows mais comment vois-tu que le codage est UTF 16 ?
    Pour Notepad++ je ne sais pas, et je ne pourrai pas t'aider, l'auteur m'interdit de l'utiliser.
    Sur le Notepad Windows de base, quand on ouvre le fichier, on voit le codage détecté en bas à droite.

  6. #6
    Membre averti Avatar de ddaweb
    Homme Profil pro
    Webmaster amateur
    Inscrit en
    Janvier 2013
    Messages
    329
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Webmaster amateur
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Janvier 2013
    Messages : 329
    Points : 429
    Points
    429
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Pour Notepad++ je ne sais pas, et je ne pourrai pas t'aider, l'auteur m'interdit de l'utiliser.
    Sur le Notepad Windows de base, quand on ouvre le fichier, on voit le codage détecté en bas à droite.
    Séb a été puni

    Notepad++ c'est également en bas à droite :

    Nom : Notepad++.jpg
Affichages : 37
Taille : 10,2 Ko

    Pour votre fichier :

    Nom : Notepad++2.jpg
Affichages : 36
Taille : 11,0 Ko

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2009
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2009
    Messages : 874
    Points : 371
    Points
    371
    Par défaut
    C'était trop simple !
    Merci à tous

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

Discussions similaires

  1. [Toutes versions] codage de fichiers écrit en arabe à chaque ouverture de word.
    Par Abdelinho dans le forum Word
    Réponses: 1
    Dernier message: 29/01/2014, 22h32
  2. Toujours demander avant d ouvrir ce fichier
    Par bibi28 dans le forum Outlook
    Réponses: 2
    Dernier message: 11/02/2011, 17h54
  3. [PHP 5.2] fwrite s'execute toujours 2 fois en fin de fichier
    Par patouche dans le forum Langage
    Réponses: 6
    Dernier message: 28/06/2010, 02h00
  4. codage des floats sur 4 bytes
    Par pfeuh dans le forum Débuter
    Réponses: 5
    Dernier message: 27/01/2010, 15h30
  5. Codage wave / float
    Par Fabllot dans le forum C
    Réponses: 3
    Dernier message: 24/05/2006, 17h14

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